2017-02-16 11 views
1

私は長年にわたってこれと戦ってきました。私はサーバーに画像をアップロードしようとしていますが、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) } 

次に、実際のP​​OSTリクエストを実行するために使用するコードを示します。私はポストボディを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.] 
+0

どのバックエンドにもアップロードしていますか?エラーログにアクセスできますか?あなたはどんな反応を得ていますか? ChromeのPostmanアプリを使用してリクエストをバックエンドに複製してください。問題が迅速なコードであることがわかっている場合は、それを使用してください。正確な答えを得るための十分な情報がここにありません。 – Scriptable

+0

@ RESTful Webサービスをスクリプト化できます。いいえ、私はエラーログにアクセスできません。私はこのエラーが表示されます:500エラーからのデータ:["codesc":GENERALERROR、 "code":5001、 "msg":文字列 "Optional(1004007)"から 'Double'を入力すると変換されません。この情報で私の質問。 –

+0

あなたはapi呼び出しを行うために他のレストクライアントを使用するときに適切な結果を得ますか? – souvickcse

答えて

0

500内部サーバーエラーは、サーバー側のエラーは、問題はおそらくではないという意味であり、あなたのコンピュータやインターネット接続は、代わりにWebサイトのサーバーに問題があります。

0

わかりました。返されるエラーメッセージを深く掘り下げるために@Scriptableに感謝しています。

APIはプロパティの1つ、つまりidプロパティで2倍を期待していたようですが、私はStringを渡していました。

また、postBody Dictionaryをオプションのものから非オプションのものに変更する必要がありました。

これが変更され、問題が修正されました。

0
var task = URLSession().uploadTask(with: urlRequest, from: imageData) { (data , response , error) in 
     // Check Response here 
    }) 

task.resume()

あなたが送信されたデータは、あなたが渡しているデータはオプション値ではありませんことを確認し、オプションの値です。

関連する問題