【发布时间】:2016-11-03 02:08:10
【问题描述】:
以下代码基于this excellent SO answer for making POST requests on iOS。此代码尝试向以下位置发出 POST 请求:
如果URLRequest 对象的httpBody 属性没有值,或者该值只是空字符串,则请求有效。
但是,一旦将非空值分配给 httpBody,请求就会超时。
有人知道为什么吗?
// Succeeds
let userOptions = ["url": "http://requestb.in/14090od1"]
userOptions["bodyString" : ""]
doPost(userOptions: userOptions)
// Fails
let userOptions = ["url": "http://requestb.in/14090od1"]
userOptions["bodyString" : "hi"]
doPost(userOptions: userOptions)
fileprivate func doPost(userOptions: [String:Any]) {
// Get URL string
let urlString = userOptions["url"] as? String ?? ""
// If invalid URL, return early
guard let url = URL(string: urlString) else {
printError("Error in doPost: malformed URL")
return
}
// If here, URL valid so execute request
// Create request
var request = URLRequest(url: url)
// Add headers
if let tHeaders = userOptions["headers"] as? [String:String] {
for (key, value) in tHeaders {
request.setValue(value, forHTTPHeaderField: key)
}
}
// Add body data
let bodyString = userOptions["bodyString"] as? String ?? ""
request.httpBody = bodyString.data(using: .utf8)
// Create data task
let task = URLSession.shared.dataTask(with: request) { data, response, error in
// If networking error, return early
guard let data = data, let httpResponse = response as? HTTPURLResponse, error == nil else {
printError("Error with network while executing POST request: \(error)")
return
}
// Why, oh why, does it not reach here???
}
// Start data task
print("Executing HTTP request: \(request)")
task.resume()
}
【问题讨论】:
-
除了设置
httpMethod,值得注意的是,当您执行请求时,通常使用JSON、XML 或x-www-form-urlencoded接受的Content-Type设置之一。您的网络服务期待什么?看到只是"Hi"的请求正文是非常不寻常的。您在 Web 服务中解析请求正文的精度如何? -
@Rob 是的,明白这很不寻常,但目标是尽可能简化问题。感谢您对这个问题的帮助以及对其他问题的回答!
标签: ios swift url nsurlsession nsurlrequest