以下代碼基於this excellent SO answer for making POST requests on iOS。此代碼試圖做一個POST請求:如果沒有爲URLRequest
對象的httpBody
屬性的值,或者如果該值爲空串iOS:HTTP POST請求在設置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的接受'內容Type'設置一個,或者'X WWW的形式,進行了urlencoded '。你的網絡服務期待什麼?看到一個只是「嗨」的請求體是非常不尋常的。您在您的Web服務中解析請求正文的準確程度如何? – Rob
@Robyup,理解這很不尋常,但目標是儘可能簡化問題。感謝您在這個問題上的幫助,併爲其他問題提供答案! – Crashalot