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发送了手动请求,他们经历的很好。 –