Обработка перенаправлений и других изменений запроса
Перенаправление происходит, когда сервер реагирует на запрос путем указания, что клиент должен выполнить новый запрос к различному 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 |
} |
Если делегат не обеспечивает реализацию для надлежащего перенаправления, обрабатывающего метод делегата, все канонические изменения и перенаправления сервера позволяются.