URLSession响应不包含上次重定向的标头

时间:2019-09-26 19:07:09

标签: swift urlsession

我有一个URL,当我在Web浏览器中调用该URL时,它将重定向我2次,并且在第二个重定向的响应标头中,它将发送我要提取的信息。

因此,为了迅速快速地自动提取该信息,我编写了这段简短的代码来发出HTTP请求,然后打印响应头:

printv(text: "Loading JSID Location")
req = URLRequest.init(url: JSIDLocation!)
var task : URLSessionDataTask
task = URLSession.shared.dataTask(with: req) {(data, response, error) in
    if let res = response as? HTTPURLResponse {
        res.allHeaderFields.forEach { (arg0) in
           let (key, value) = arg0
              self.printv(text: "\(key): \(value)")
           }
    }
    self.printv(text: String.init(data: data!, encoding: String.Encoding.utf8)!)
}
task.resume()

({printv是将字符串格式化并打印到标签上的函数)

因此,当我运行此命令时,我希望它可以打印响应标头和最后一个重定向的正文,但是实际上发生的是,我只打印了响应标头和原始URL的正文。由于这些内容不包含我正在寻找的信息,因此对我没有帮助。我已经用谷歌搜索了问题,发现默认情况下,HTTP重定向是在URLSessions中激活的,您必须弄混URLSessionDelegates才能停用它们,但这绝对不是我要做的。 谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果要重定向信息,则需要成为URLSessionDataTaskDelegate

let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil)

然后您需要实现重定向委托功能,并确保使用给定的新重定向请求调用完成处理程序:

func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) {
    // operate on response to learn about the headers here
    completionHandler(request)
}