【问题标题】:iOS: HTTP POST request times out when setting httpBody propertyiOS:设置 httpBody 属性时 HTTP POST 请求超时
【发布时间】:2016-11-03 02:08:10
【问题描述】:

以下代码基于this excellent SO answer for making POST requests on iOS。此代码尝试向以下位置发出 POST 请求:

http://requestb.in/14090od1

如果URLRequest 对象的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 或x-www-form-urlencoded 接受的Content-Type 设置之一。您的网络服务期待什么?看到只是"Hi" 的请求正文是非常不寻常的。您在 Web 服务中解析请求正文的精度如何?
  • @Rob 是的,明白这很不寻常,但目标是尽可能简化问题。感谢您对这个问题的帮助以及对其他问题的回答!

标签: ios swift url nsurlsession nsurlrequest


【解决方案1】:

如果要做POST请求,不仅要设置httpBody,还要设置请求的httpMethodPOST

request.httpMethod = "POST"

【讨论】:

  • 但是,当httpBody 属性为非空时,为什么它会超时?
  • 我认为它源于使用默认的httpMethodGET 创建一个具有httpBody 的请求,该请求从不发送任何httpBody。不过,我希望它能更优雅地处理这个问题。
  • 谢谢。是的,这也是我的假设,但从技术上讲,它不应该影响在请求正文中发送数据的 GET 请求,对吧?
  • 我不会为这种行为辩护,因为它很愚蠢。 GET 请求不使用正文,因此,恕我直言,它应该在没有正文的情况下发送它,或者更好地生成警告。
  • 好的,谢谢。 100% 同意。顺便说一句,您是否碰巧对这个问题有建议:stackoverflow.com/questions/40334905/…。无论哪种方式,感谢您的所有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2014-12-06
  • 1970-01-01
  • 2023-03-20
  • 2015-08-15
  • 2017-03-10
相关资源
最近更新 更多