以下のコードはthis excellent SO answer for making POST requests on iOSに基づいています。このコードは、にPOSTリクエストを作成しようとします。URLRequest
オブジェクトのhttpBody
プロパティの値がない場合、または値が唯一の空の文字列である場合iOS:httpBodyプロパティを設定するとHTTP POST要求がタイムアウトします
要求は動作します。
ただし、空でない値が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の受け入れ'のContent-type'が設定のいずれかを使用するか、 'x-www-form-urlencodedであることは注目に値します'。あなたのWebサービスは何を期待していますか?単純に ''こんにちは ''である要求本体を見るのはまれです。どのくらい正確にあなたのWebサービスでリクエストの本文を解析していますか? – Rob
@Rob yup、それは珍しいことだと理解しましたが、目標は可能な限り質問を簡素化することでした。この質問に対するあなたの助けをしてくれてありがとう、もう1つの質問への答えを提供してくれてありがとう! – Crashalot