下面的代码:斯威夫特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和我的代码基本相同。
你检查过,JSONSerialization是否成功,是'requestBody'而不是'nil'?你也不应该把'requestBody'定义为'[String:Any]',因为它的唯一值显然是'String'类型,所以'requestBody'应该是'[String:String]',但是不需要无论如何,类型注释。 –
'这个工作,当我手动发送请求'你是什么意思?另外,你可以检查'requestBody'的值吗? – Larme
此行为可能有不同的问题。我认为你也应该验证你的传输数据是否有正确的编码。你应该尝试设置你的内容类型。因为如果期望的内容类型是例如'x-www-form-urlencoded'并且你正在发送'application/json',服务器就不会像你期望的那样接收或处理数据。 – weissja19