2016-11-03 5 views
1

以下のコードはthis excellent SO answer for making POST requests on iOSに基づいています。このコードは、にPOSTリクエストを作成しようとします。URLRequestオブジェクトのhttpBodyプロパティの値がない場合、または値が唯一の空の文字列である場合iOS:httpBodyプロパティを設定するとHTTP POST要求がタイムアウトします

http://requestb.in/14090od1

要求は動作します。

ただし、空でない値が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() 
} 
+0

'httpMethod'の設定以外に、それはあなたが要求を実行するとき、あなたは一般的にJSON、XMLの受け入れ'のContent-type'が設定のいずれかを使用するか、 'x-www-form-urlencodedであることは注目に値します'。あなたのWebサービスは何を期待していますか?単純に ''こんにちは ''である要求本体を見るのはまれです。どのくらい正確にあなたのWebサービスでリクエストの本文を解析していますか? – Rob

+0

@Rob yup、それは珍しいことだと理解しましたが、目標は可能な限り質問を簡素化することでした。この質問に対するあなたの助けをしてくれてありがとう、もう1つの質問への答えを提供してくれてありがとう! – Crashalot

答えて

0

あなたがPOSTリクエストをしたい場合は、httpBodyを設定したいのですが、あなたはまた、POSTにリクエストのhttpMethodを設定したくないだけではなく。

request.httpMethod = "POST" 
+0

これで解決しました!ありがとう。 – Crashalot

+0

しかし、 'httpBody'プロパティが空でないときにタイムアウトする理由は何ですか? – Crashalot

+0

私は 'httpBody'を送信しない' GET'のデフォルト 'httpMethod'を使って' httpBody'を持つリクエストを作成していると仮定します。私はそれがより優雅にこれを処理したいと思います。 – Rob

関連する問題