Обработка перенаправлений и других изменений запроса
Перенаправление происходит, когда сервер реагирует на запрос путем указания, что клиент должен выполнить новый запрос к различному URL. NSURLSession
, NSURLConnection
, и NSURLDownload
классы уведомляют своих делегатов, когда это происходит.
Для обработки перенаправления URL, загружающий делегата класса, должен реализовать один из следующих методов делегата:
Для
NSURLSession
, реализуйтеURLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:
метод делегата.Для
NSURLConnection
, реализуйтеconnection:willSendRequest:redirectResponse:
метод делегата.Для
NSURLDownload
, реализуйтеdownload:willSendRequest:redirectResponse:
метод делегата.
В этих методах делегат может исследовать новый запрос и ответ, который вызвал перенаправление и может возвратить новый объект запроса через обработчик завершения для NSURLSession
или через возвращаемое значение для NSURLConnection
и NSURLDownload
.
Делегат может сделать любое следующее:
Позвольте перенаправление путем простого возврата предоставленного запроса.
Создайте новый запрос, указав на различный URL и возврат тот запрос.
Отклоните перенаправление и получите любые существующие данные от соединения путем возврата
nil
.
Кроме того, делегат может отменить и перенаправление и соединение. С NSURLSession
, делегат делает это путем отправки cancel
обменивайтесь сообщениями к объекту задачи. С NSURLConnection
или NSURLDownload
APIs, делегат делает это путем отправки cancel
обменивайтесь сообщениями к NSURLConnection
или NSURLDownload
объект.
Делегат также получает connection:willSendRequest:redirectResponse:
обменивайтесь сообщениями если NSURLProtocol
подкласс, обрабатывающий запрос, изменился NSURLRequest
для стандартизации его формата, например, изменив запрос на http://www.apple.com
к http://www.apple.com/
. Это происходит, потому что стандартизированная, или каноническая, версия запроса используется для управления кэшем. В этом особом случае ответ, переданный делегату, nil
и делегат должен просто возвратить предоставленный запрос.
Реализация в качестве примера в Перечислении 5-1 позволяет канонические изменения и отклоняет все перенаправления сервера.
Пример перечисления 5-1 реализации connection:willSendRequest:redirectResponse:
#if FOR_NSURLSESSION |
- (void)URLSession:(NSURLSession *)session |
task:(NSURLSessionTask *)task |
willPerformHTTPRedirection:(NSHTTPURLResponse *)redirectResponse |
newRequest:(NSURLRequest *)request |
completionHandler:(void (^)(NSURLRequest *))completionHandler |
#elif FOR_NSURLCONNECTION |
-(NSURLRequest *)connection:(NSURLConnection *)connection |
willSendRequest:(NSURLRequest *)request |
redirectResponse:(NSURLResponse *)redirectResponse |
#else // FOR_NSURLDOWNLOAD |
-(NSURLRequest *)download:(NSURLConnection *)connection |
willSendRequest:(NSURLRequest *)request |
redirectResponse:(NSURLResponse *)redirectResponse |
#endif |
{ |
NSURLRequest *newRequest = request; |
if (redirectResponse) { |
newRequest = nil; |
} |
#if FOR_NSURLSESSION |
completionHandler(newRequest); |
#else |
return newRequest; |
#endif |
} |
Если делегат не обеспечивает реализацию для надлежащего перенаправления, обрабатывающего метод делегата, все канонические изменения и перенаправления сервера позволяются.