Swift POST请求发送一个空的正文

T. *_*kes 3 rest json ios swift

这是代码:

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()
}
Run Code Online (Sandbox Code Playgroud)

这将向Flask发送一个{“ name”:“ 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")

}
Run Code Online (Sandbox Code Playgroud)

我尝试添加斜杠,只是在控制台中得到404。我发现的唯一类似于我的问题是:如何在Swift中使用JSON主体发出HTTP Post请求,我的代码基本上是相同的。

T. *_*kes 5

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

urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.setValue("application/json", forHTTPHeaderField: "Accept")
Run Code Online (Sandbox Code Playgroud)

解决了错误。现在,代码可以按我预期的那样工作了。

PS我无法捕获它,因为我使用应用程序Paw进行测试,该程序会自动设置内容类型。