我有一个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
才能停用它们,但这绝对不是我要做的。
谢谢您的帮助!
答案 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)
}