2016-11-03 84 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