Обработка перенаправлений и других изменений запроса

Перенаправление происходит, когда сервер реагирует на запрос путем указания, что клиент должен выполнить новый запрос к различному URL. NSURLSession, NSURLConnection, и NSURLDownload классы уведомляют своих делегатов, когда это происходит.

Для обработки перенаправления URL, загружающий делегата класса, должен реализовать один из следующих методов делегата:

В этих методах делегат может исследовать новый запрос и ответ, который вызвал перенаправление и может возвратить новый объект запроса через обработчик завершения для NSURLSession или через возвращаемое значение для NSURLConnection и NSURLDownload.

Делегат может сделать любое следующее:

Кроме того, делегат может отменить и перенаправление и соединение. С 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
}

Если делегат не обеспечивает реализацию для надлежащего перенаправления, обрабатывающего метод делегата, все канонические изменения и перенаправления сервера позволяются.