iOS: 设置 httpBody 属性 时 HTTP POST 请求超时
iOS: HTTP POST request times out when setting httpBody property
以下代码基于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()
}
如果你想做一个POST
请求,你不仅要设置httpBody
,还要设置请求的httpMethod
为POST
.
request.httpMethod = "POST"
以下代码基于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()
}
如果你想做一个POST
请求,你不仅要设置httpBody
,还要设置请求的httpMethod
为POST
.
request.httpMethod = "POST"