Ответ URLSession не содержит заголовков с последнего перенаправления - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть 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 голосов
/ 26 сентября 2019

Если вам нужна информация о перенаправлении, вам нужно стать 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)
}
...