以下是代码:
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我的代码基本相同。
答案 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
,服务器可能不支持