2016-11-03 82 views
1

以下代碼基於this excellent SO answer for making POST requests on iOS。此代碼試圖做一個POST請求:如果沒有爲URLRequest對象的httpBody屬性的值,或者如果該值爲空串iOS:HTTP POST請求在設置httpBody屬性時超時

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的接受'內容Type'設置一個,或者'X WWW的形式,進行了urlencoded '。你的網絡服務期待什麼?看到一個只是「嗨」的請求體是非常不尋常的。您在您的Web服務中解析請求正文的準確程度如何? – Rob

+0

@Robyup,理解這很不尋常,但目標是儘可能簡化問題。感謝您在這個問題上的幫助,併爲其他問題提供答案! – Crashalot

回答

0

如果你想要做一個POST要求,你不僅要設置的httpBody,但你也想請求的httpMethod設置爲POST

request.httpMethod = "POST" 
+0

這解決了它!謝謝。 – Crashalot

+0

但任何線索爲什麼當httpBody屬性非空時超時? – Crashalot

+0

我假設它源於創建一個請求,該請求具有使用'GET'的默認'httpMethod'的'httpBody',它從不發送任何'httpBody'。不過,我希望它更優雅地處理這件事。 – Rob