コンテンツアップロード {"code":4001,"message":"Invalid Auth"}
画像データを送信するためにコンテンツアップロードを行いリソースIDの取得をしたいと思っています。
言語はSwiftを使用しています。
画像データは、iphoneで撮影したUIImage画像をアプリ内のドキュメントに保存しています。
画像が保存されているパスの取得を行い、パスから画像データを取得してrequest.httpBodyに渡してパラメータとして詰めています。
HTTP Method
POST(Content-Type: multipart/form-data)
Request Header
リクエストヘッダー | 説明 |
---|---|
consumerKey | Server API Consumer Key |
authorization | Token 'Bearer' を明記し、'Bearer' と 'Token' の間に半角スペース (space) を入れること。 |
x-works-apiid | API 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 - 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
まだ、解決できませんか?
今すぐ実際に使用しているLINE WORKSユーザーに質問してみましょう。