私は長年にわたってこれと戦ってきました。私はサーバーに画像をアップロードしようとしていますが、500のエラーが続いています。なぜこのHTTP POSTリクエストで内部サーバーエラー(500)が発生する可能性がありますか
ここでは、イメージを取得するために使用するコードをbase64でエンコードし、それを辞書に追加します。
if let imageDataToUpload = UIImageJPEGRepresentation(selectedImage, 1.0) {
let encodedImageData = imageDataToUpload.base64EncodedString(options: [])
let extras = "data:image/jpeg;base64,"
let postBody = [
"image": extras + encodedImageData,
"id": id,
"instruction": "1",
"ext": ""
]
let endPoint = UrlFor.uploadPhoto
ApiManager().apiPostImage(endPoint: endPoint, postBody: postBody, callBackFunc: handleResultOfUploadPhoto) }
次に、実際のPOSTリクエストを実行するために使用するコードを示します。私はポストボディをJSONオブジェクトに変換しようとしていることに気付くでしょう。
func apiPostImage(endPoint: String, postBody: [String: Any]?, callBackFunc: @escaping (ResultOfApiCall) -> Void) {
// get the sessionKey
guard let sessionKey = KeyChainManager().getSessionKey() else {
print("error getting session key")
AppDelegate().signUserOut()
return
}
// create a url with above end point and check its a valid URL
guard let url = URL(string: endPoint) else {
print("Error: cannot create URL")
return
}
// set up the request
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "POST"
if let postBody = postBody {
do {
try urlRequest.httpBody = JSONSerialization.data(withJSONObject: postBody, options: [])
} catch {
print("problems creating json body")
}
}
// set up the header
let config = URLSessionConfiguration.default
config.httpAdditionalHeaders = [
"Accept": "application/json",
"apiKey": "0101010-0101010", // not the real apiKey
"usrKey": sessionKey,
"appInfo" : "appcode:1000|version:2.0.37",
"Content-Type": "application/json"
]
let session = URLSession(configuration: config)
let task = session.dataTask(with: urlRequest, completionHandler:
{ (data: Data?, response: URLResponse?, error: Error?) -> Void in
let (noProblem, ResultOfCall) = self.checkIfProblemsWith(data: data, response: response, error: error)
guard noProblem else {
callBackFunc(ResultOfCall)
return
}
let serializedData: [String:Any]
do {
// safe bc checked for nil already.
serializedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any]
} catch {
callBackFunc(ResultOfApiCall.errorWhileSerializingJSON)
return
}
// pass serialized data back using the callBackFunc
callBackFunc(ResultOfApiCall.success(serializedData))
})
task.resume()
}
APIはRESTfulです。私はAPIのエラーログにアクセスすることはできませんが、私は戻ってAPIからこのエラーを取得しています:
["codesc": GENERALERROR, "code": 5001, "msg": Conversion from string "Optional(1004007)" to type 'Double' is not valid.]
どのバックエンドにもアップロードしていますか?エラーログにアクセスできますか?あなたはどんな反応を得ていますか? ChromeのPostmanアプリを使用してリクエストをバックエンドに複製してください。問題が迅速なコードであることがわかっている場合は、それを使用してください。正確な答えを得るための十分な情報がここにありません。 – Scriptable
@ RESTful Webサービスをスクリプト化できます。いいえ、私はエラーログにアクセスできません。私はこのエラーが表示されます:500エラーからのデータ:["codesc":GENERALERROR、 "code":5001、 "msg":文字列 "Optional(1004007)"から 'Double'を入力すると変換されません。この情報で私の質問。 –
あなたはapi呼び出しを行うために他のレストクライアントを使用するときに適切な結果を得ますか? – souvickcse