Swift POST请求发送一个空主体

时间:2017-08-15 11:03:21

标签: ios json swift rest

以下是代码:

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发送一个{"名称":" Go"} 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我的代码基本相同。

2 个答案:

答案 0 :(得分:4)

@ weissja19是正确的,我需要将内容类型设置为application/json。添加

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

修正了错误。现在代码按照我的预期工作。

P.S。我无法抓住它,因为我使用应用程序Paw进行测试,它会自动设置内容类型。

答案 1 :(得分:0)

您可能希望手动执行此操作:

set @@global.show_compatibility_56=ON;

使用urlRequest.httpBody = "name=\(languageName)".data(using: .utf8)会使您的POST正文如JSONSerialization,服务器可能不支持