2017-08-15 46 views
0

下面的代碼:斯威夫特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() 
} 

這發出{「名」:「開始」} JSON字典瓶。 Flask應該將語言名稱追加到數組中,並在響應中返回完整的數組。現在,當我手動發送請求時,這會起作用,所以它不是Flask的錯誤。但是當我從iOS發送上述內容時,我在flask控制檯中獲取了request.json == None。顯然,我發送一個空的身體,但我不應該。任何想法我錯了?

我所說的功能

@IBAction func pressedMakePOSTCall(_ sender: UIButton) { 

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

} 

我嘗試添加一個尾隨斜線,只需在控制檯中得到404。我發現的唯一類似於我的問題是: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

@ weissja19是正確的,我需要支持設置內容類型爲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會讓你的POST身體像{"name":"abc"}這可能不是你的服務器

+0

這正是我想要做的。 Flask服務器在請求正文中接收到json時解析json。我已經用Paw發送了手動請求,他們經歷的很好。 –