详细解析几个和网络请求有关的类(八) —— 处理重定向和其他请求
版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.03.11 |
前言
我们做APP发起网络请求,一般都是使用框架,这些框架的底层也都是苹果的API,接下来几篇就一起来看一下和网络有关的几个类。感兴趣的可以看上面几篇文章。
1. 详细解析几个和网络请求有关的类 (一) —— NSURLSession
2. 详细解析几个和网络请求有关的类(二) —— NSURLRequest和NSMutableURLRequest
3. 详细解析几个和网络请求有关的类(三) —— NSURLConnection
4. 详细解析几个和网络请求有关的类(四) —— NSURLSession和NSURLConnection的区别
5. 详细解析几个和网络请求有关的类(五) —— 关于NSURL加载系统(一)
6. 详细解析几个和网络请求有关的类(六) —— 使用NSURLSession(二)
7. 详细解析几个和网络请求有关的类(七) —— URL数据的编码和解码(三)
回顾
上一篇主要讲述了URL数据的编码和解码,这一篇主要讲述处理重定向和其他请求更改。
处理重定向和其他请求更改
当服务器通过指示客户端应该向另一个URL发出新请求来响应请求时,会发生重定向。发生这种情况时,NSURLSession类会通知它的代理。
要处理重定向,您的URL加载类代理必须实现URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:代理方法。
在这种方法中,委托可以检查新请求和导致重定向的响应,并且可以通过NSURLSession的完成处理程序返回一个新的请求对象。
代理可以执行以下任何操作:
- 通过简单地返回提供的请求来允许重定向。
- 创建一个新的请求,指向一个不同的URL,并返回该请求。
- 通过返回nil拒绝重定向并接收来自连接的任何现有数据。
另外,代理可以取消重定向和连接。使用NSURLSession,代理通过将- cancel
消息发送给任务对象来完成此操作。
如果处理请求的NSURLProtocol子类改变NSURLRequest以规范它的格式,例如,改变用于http://www.apple
的请求为http://www.apple.com/
。代理还接收URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:
消息。发生这种情况是因为请求的标准版或规范版用于缓存管理。在这种特殊情况下,传递给代理的响应为nil,代理应该简单地返回提供的请求。
Listing 3-1中的示例实现允许规范更改并拒绝所有服务器重定向。
// Listing 3-1 Example of an implementation of 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);
}
如果代理没有为合适的重定向处理代理方法提供实现,则允许所有规范更改和服务器重定向。
后记
本篇主要介绍处理重定向和其他请求更改。