Bot

コンテンツアップロード {"code":4001,"message":"Invalid Auth"}

M,

2021.03.25既読 2930

画像データを送信するためにコンテンツアップロードを行いリソースIDの取得をしたいと思っています。

言語はSwiftを使用しています。

画像データは、iphoneで撮影したUIImage画像をアプリ内のドキュメントに保存しています。

画像が保存されているパスの取得を行い、パスから画像データを取得してrequest.httpBodyに渡してパラメータとして詰めています。


以下の4つの情報をヘッダーに詰めてリクエストを送信しています。

HTTP Method

POST(Content-Type: multipart/form-data)

Request Header

リクエストヘッダー説明
consumerKeyServer API Consumer Key
authorizationToken
'Bearer' を明記し、'Bearer' と 'Token' の間に半角スペース (space) を入れること。
x-works-apiidAPI ID
画像データをhttp.Bodyに詰める処理については、以下の様な形式で作成を行い、URLSessionを使用したPOST送信をしています。
// ファイルデータ
let CRLF = "\r\n"
body.append(("--\(boundary)" + CRLF).data(using: .utf8)!)
body.append(("Content-Disposition: form-data; name=\"\(resourceName)\"; filename=\"\(ファイル名)\"" + CRLF).data(using: .utf8)!)
body.append(("Content-Type: \(type)" + CRLF + CRLF).data(using: .utf8)!)
body.append(保存処理を行いパスから取得した画像データの値)
body.append(CRLF.data(using: .utf8)!)
// フッタ
body.append(("--\(boundary)--" + CRLF).data(using: .utf8)!)
req.httpBody = body
この下にURLSessionでリクエスト送信を行う処理を書いています。
リクエスト送信を行うと、レスポンスを取得することが出来るのですが、
レスポンス内容として{"code":4001,"message":"Invalid Auth"}が返ってくる状況です。
こちらのエラー内容について以前質問をされている方がいらっしゃったので、そちらの情報を元に幾つか確認を行いました。
form-data を使用していること
resourceName を指定していること
・Tokenの有効期限が切れていない(使用できる)こと
以上の3点を確認済みです。
他に考えられる可能性や情報などありましたら教えて頂きたいと思っています。

コメント1

  • 업데이트 된 답글입니다.

    佐藤正宗

    Swift での開発はしたことがないので参考になるかはわかりませんが、検証ツールの Postman でサンプルコードが出力できたので貼り付けときますね。ご参考まで。

    Swift - URLSession

    import Foundation
    #if canImport(FoundationNetworking)
    import FoundationNetworking
    #endif

    var semaphore = DispatchSemaphore (value: 0)

    let parameters = [
     [
       "key": "resourceName",
       "src": "/C:/Users/UserName/Desktop/TEST_PNG.png",
       "type": "file"
     ]] as [[String : Any]]

    let boundary = "Boundary-\(UUID().uuidString)"
    var body = ""
    var error: Error? = nil
    for param in parameters {
     if param["disabled"] == nil {
       let paramName = param["key"]!
       body += "--\(boundary)\r\n"
       body += "Content-Disposition:form-data; name=\"\(paramName)\""
       if param["contentType"] != nil {
         body += "\r\nContent-Type: \(param["contentType"] as! String)"
       }
       let paramType = param["type"] as! String
       if paramType == "text" {
         let paramValue = param["value"] as! String
         body += "\r\n\r\n\(paramValue)\r\n"
       } else {
         let paramSrc = param["src"] as! String
         let fileData = try NSData(contentsOfFile:paramSrc, options:[]) as Data
         let fileContent = String(data: fileData, encoding: .utf8)!
         body += "; filename=\"\(paramSrc)\"\r\n"
           + "Content-Type: \"content-type header\"\r\n\r\n\(fileContent)\r\n"
       }
     }
    }
    body += "--\(boundary)--\r\n";
    let postData = body.data(using: .utf8)

    var request = URLRequest(url: URL(string: "http://storage.worksmobile.com/openapi/message/upload.api";)!,timeoutInterval: Double.infinity)
    request.addValue("xxxxxxxxxxxx", forHTTPHeaderField: "consumerKey")
    request.addValue("xxxxxxxxxxxx", forHTTPHeaderField: "x-works-apiid")
    request.addValue("Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxx", forHTTPHeaderField: "Authorization")
    request.addValue("LC=en_US; language=en_US", forHTTPHeaderField: "Cookie")
    request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

    request.httpMethod = "POST"
    request.httpBody = postData

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
     guard let data = data else {
       print(String(describing: error))
       semaphore.signal()
       return
     }
     print(String(data: data, encoding: .utf8)!)
     semaphore.signal()
    }

    task.resume()
    semaphore.wait()

    2021.03.26

    0
前の投稿 全トークの内容をリアルタイムで見たい
次の投稿1つのボットを複数のテナントに実装する方法
リスト

まだ、解決できませんか?
今すぐ実際に使用しているLINE WORKSユーザーに質問してみましょう。