处理重定向和其他请求更改 <- URL会话编程指南
2017-07-11 本文已影响21人
raingu24
当服务器对请求的响应是通过表明客户端需要制作一个不同的URL的请求时,会产生重定向。当重定向发生时,NSURLSession类会通知它的委托。
为了处理重定向,URL加载类委托必须实现URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:方法。
在这个方法中,委托可以检查新的请求以及导致重定向的响应,并且可以通过NSURLSession的完成处理程序返回一个新的请求对象。
委托可以执行以下任何操作:
- 通过简单的返回所提供的请求来允许重定向。
- 创建一个新请求,指向一个不同的URL,并且返回该请求。
- 通过返回nil来拒绝重定向,并接收连接的任何现有的数据。
另外,委托可以取消重定向和连接。使用NSURLSession,委托通过发送cancel消息给任务对象来做完成此操作。
如果处理请求的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的实现示例
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);
}
如果委托不提供恰当的重定向处理委托方法的实现,所有规范的更改和服务器重定向都会被允许。