2017-08-15 32 views
0

は、ここでは、コードです:フラスコにJSON辞書:スウィフトPOSTリクエスト空のボディを送信

func makePOSTCall(endpoint: String, languageName: String) { 
    guard let url = URL(string: endpoint) else { 
     print("Could not create URL.") 
     return 
    } 

    let requestLang: [String: Any] = ["name": languageName] 
    let requestBody = try? JSONSerialization.data(withJSONObject: requestLang) 

    var urlRequest = URLRequest(url: url) 
    urlRequest.httpBody = requestBody 
    urlRequest.httpMethod = "POST" 
    let session = URLSession.shared 
    let task = session.dataTask(with: urlRequest) { 

     data, response, error in 
     guard let data = data, error == nil else { 
      print(error?.localizedDescription ?? "No data") 
      return 
     } 

     let responseJSON = try? JSONSerialization.jsonObject(with: data, options: []) 
     if let responseJSON = responseJSON as? [String: Any] { 
      print(responseJSON) 
     } 

    } 
    task.resume() 
} 

これは、{「行く」「名を」}送信します。 Flaskは、配列に言語名を追加し、レスポンスで完全な配列を返すものとします。今、私は手動で要求を送信するので、これはFlaskのエラーではありません。しかし、私がiOSから上記を送ると、私はrequest.json == Noneをフラスココンソールに入れます。明らかに、私は空の体を送るが、私はそうすべきではない。どこが間違っていたのか?

私はちょうどコンソールで404を取得し、末尾にスラッシュを追加してみました。

@IBAction func pressedMakePOSTCall(_ sender: UIButton) { 

    makePOSTCall(endpoint: "http://127.0.0.1:5000/lang", languageName: "Go") 

} 

としての機能を呼び出します私が見つけた鉱山に似た唯一の質問はこれです:How to make HTTP Post request with JSON body in Swiftと私のコードは基本的に同じです。

+0

JSONSerializationが成功したかどうかを確認しましたか? 'requestBody'は' nil'ではありませんか? 'requestBody'は' [String:Any] 'として定義するべきではありません。その値は明らかに' String'型なので、 'requestBody'は' [String:String] 'にする必要があります。とにかくタイプ注釈。 –

+0

'これは私が手動でリクエストを送信したときに動作します'それはどういう意味ですか?また、 'requestBody'の値をチェックできますか? – Larme

+0

この動作には異なる問題があります。あなたのトランスレートされたデータが適切なエンコーディングを持っているかどうかを確認する必要があります。そしてあなたのコンテンツタイプを設定しようとする必要があります。予想されるコンテンツタイプが 'x-www-form-urlencoded'の場合、' application/json'を送信しているため、サーバは期待通りにデータを受信または処理しません。 – weissja19

答えて

0

サーバーでサポートされていない可能性があります{"name":"abc"}のようなあなたのPOSTボディコンテンツタイプをapplication/jsonに設定します。追加中

urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") 
urlRequest.setValue("application/json", forHTTPHeaderField: "Accept") 

エラーを修正しました。今、コードは私の期待どおりに動作します。

P.S.私はコンテンツタイプを自動的に設定するテストのためにPawアプリを使用しているので、私はそれをキャッチできませんでした。

0

あなたはそれを手動で行いたい場合があります

urlRequest.httpBody = "name=\(languageName)".data(using: .utf8)

使用JSONSerializationようになりますweissja19が正しかった@、私は必要な

+0

これはまさに私がやりたいことです。 Flaskサーバーは、jsonが要求本体でそれを受け取ると、それを解析します。私はPawで手作業によるリクエストを送ったが、うまくいった。 –

関連する問題