NSURLResponse没有名为allHeaderFields的成员

时间:2014-07-28 04:32:47

标签: ios post http-headers swift nsurlrequest

我正在向API发出POST请求,我在Swift中成功获得了响应。以下是我的代码。

private func getData(url: NSURL) {
    let config: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session: NSURLSession = NSURLSession(configuration: config)

    let dataTask: NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in

        if error {
            println("Error Occurred: \(error.localizedDescription)")
        } else {
            println("\(response.allHeaderFields)") // Error
        }
    })
    dataTask.resume()
}

我正在尝试使用allHeaderFields转储标头字段,但我收到错误消息 NSURLResponse没有名为allHeaderFields 的成员。但它 does 拥有它!

语法或我调用它的方式一定有问题。有人可以告诉我如何纠正这个问题吗?

谢谢。

4 个答案:

答案 0 :(得分:11)

详细说明Yogesh所说的......!

尝试使用" as"将NSURLRespones转换为NSHTTPURLResponse,因为我打赌NSURLResponse实际上是NSHTTPURLResponse,或者我可能下注。

这就是我的意思:

private func getData(url: NSURL) {
    let config: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session: NSURLSession = NSURLSession(configuration: config)

    let dataTask: NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {(data: NSData!, urlResponse: NSURLResponse!, error: NSError!) -> Void in

        if let httpUrlResponse = urlResponse as? NSHTTPURLResponse
        {
            if error {
                println("Error Occurred: \(error.localizedDescription)")
            } else {
                println("\(httpUrlResponse.allHeaderFields)") // Error
            }
        }
        })

    dataTask.resume()
}

答案 1 :(得分:3)

从您提供的链接Link

  

NSHTTPURLResponse类是NSURLResponse的子类,它提供了访问特定于HTTP协议响应的信息的方法

allHeaderFieldsNSHTTPURLResponse类而非NSURLResponse类的方法。因此,您必须使用NSHTTPURLResponse而不是NSURLResponse类。

答案 2 :(得分:0)

if navigationResponse.response is HTTPURLResponse {
      let response = navigationResponse.response as! HTTPURLResponse
      print(response.allHeaderFields) // all headers
}

答案 3 :(得分:0)

迅速3和更高的解决方案

这是在Swift 3及更高版本中处理数据任务的解决方案。

let urlPath: String = "http://www.google.de"
guard let url: URL = URL(string: urlPath) else { return }
let request = URLRequest(url: url)
let response: URLResponse?

URLSession.shared.dataTask(with: request) { data, response, error in
    guard let data = data, error == nil else {
        print(error?.localizedDescription ?? "No data")
        return
    }       
    if let httpResponse = response as? HTTPURLResponse {
        print("error \(httpResponse.statusCode)")
    }
}.resume()