当服务器通过指示客户端向不同的URL发出新请求来响应请求时,会发生重定向。NSURLSession类在发生这种情况时会通知它的代理。要处理重定向,你的URL加载类代理必须实现URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:delegate方法。在这个方法中,代理可以检查引起重定向的新请求和响应,并可以通过NSURLSession
的回调返回一个新的请求对象。
代理可以执行以下任何操作:
- 允许通过简单地返回提供的请求进行重定向。
- 创建一个新请求,指向一个不同的URL,并返回该请求。
- 拒绝重定向并通过返回nil从连接中接收任何现有数据。
此外,代理可以取消重定向和连接。 使用NSURLSession
,代理通过将取消消息(cancel message
)发送到任务对象来执行此操作。如果处理请求的NSURLProtocol
子类已更改了NSURLRequest
,代理也会收到URLSession:task: willPerformHTTPRedirection: newRequest:completionHandler:消息,以便将其格式标准化,例如更改http://www.apple.com
的请求到http://www.apple.com/.
。这是因为请求的标准化或规范版本用于缓存管理。 在这种特殊情况下,传递给代表的响应为nil,代理应该只返回提供的请求
清单3-1中的示例实现允许规范更改并拒绝所有服务器重定向。
清单3-1 URLSession
的实现示例:task:willPerformHTTPRedirection:newRequest:completionHandler
- (void)URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
willPerformHTTPRedirection:(NSHTTPURLResponse *)redirectResponse
newRequest:(NSURLRequest *)request
completionHandler:(void (^)(NSURLRequest *))completionHandler
{
NSURLRequest *newRequest = request;
if (redirectResponse) {
newRequest = nil;
}
completionHandler(newRequest);
}
如果代理不提供合适的重定实现去处理代理方法,则允许所有规范更改和服务器重定向。
提示:感觉本篇翻译的不是很好,请参考原文不当之处希望各位提出来,我会及时改正。