处理重定向和其他请求更改 <- URL会话编程指南

当服务器对请求的响应是通过表明客户端需要制作一个不同的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);

}

如果委托不提供恰当的重定向处理委托方法的实现,所有规范的更改和服务器重定向都会被允许。

你可能感兴趣的:(处理重定向和其他请求更改 <- URL会话编程指南)