Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:设置httpBody属性时HTTP POST请求超时_Ios_Swift_Url_Nsurlsession_Nsurlrequest - Fatal编程技术网

iOS:设置httpBody属性时HTTP POST请求超时

iOS:设置httpBody属性时HTTP POST请求超时,ios,swift,url,nsurlsession,nsurlrequest,Ios,Swift,Url,Nsurlsession,Nsurlrequest,下面的代码基于。此代码尝试向以下对象发出POST请求: 如果URLRequest对象的httpBody属性没有值,或者该值只是空字符串,则请求有效 但是,一旦将非空值分配给httpBody,请求就会超时 有人知道为什么吗 // Succeeds let userOptions = ["url": "http://requestb.in/14090od1"] userOptions["bodyString" : ""] doPost(userOptions: userOptions) // F

下面的代码基于。此代码尝试向以下对象发出POST请求:

如果
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()
}

如果要执行
POST
请求,不仅要设置
httpBody
,还要将请求的
httpMethod
设置为
POST

request.httpMethod = "POST"

除了设置
httpMethod
,值得注意的是,在执行请求时,通常使用JSON、XML或
x-www-form-urlencoded
的可接受
内容类型设置之一。您的web服务期望什么?看到一个请求主体只是“Hi”
,这是非常不寻常的。您在web服务中解析请求主体的准确程度如何?@Rob-yup理解这是不寻常的,但目的是尽可能简化问题。感谢您在这个问题上的帮助以及为另一个问题提供的答案!但是当
httpBody
属性为非空时,它为什么会超时呢?我假设它来自于使用
GET
的默认
httpMethod
创建一个具有
httpBody
的请求,该方法从不发送任何
httpBody
。不过,我希望它能更优雅地处理这件事。谢谢。是的,这也是我的假设,但从技术上讲,它不应该影响GET请求在请求体中发送数据,对吗?我不会为这种行为辩护,因为它很愚蠢
GET
请求不使用主体,因此,IMHO,它应该在不使用主体的情况下发送请求,或者生成警告。好的,谢谢。100%同意。顺便问一下,你对这个问题有什么建议吗:。不管怎样,谢谢你的帮助!