这一篇记录的是iOS开发中关于 NSURLSession 的使用方法,其使用方法主要有采用协议方法 和 采用Block方法.这篇主要介绍采用协议方法.采用Block 实现方法将在不久进行更新.
URL:网络请求的目标路径
http://10.0.8.8:8080/sns/my/user_list.php?format=json&page=1&number=20
http:// 表示请求要遵循的网络传输协议 是HTTP协议
IP地址/主机名/域名 10.0.8.8
端口 : 8080(默认的)
资源路径:/sns/my/user_list.php
资源参数:?format=json&page=1&number=20
设置请求的缓存机制
NSURLRequestUseProtocolCachePolicy = 0,//协议缓存
NSURLRequestReloadIgnoringLocalCacheData = 1,//忽略本地缓存
NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4 //忽略本地和远程的缓存,直接发起请求
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,//忽略缓存
NSURLRequestReturnCacheDataElseLoad = 2,//优先使用缓存数据,如果没有再去网络请求
NSURLRequestReturnCacheDataDontLoad = 3,//使用缓存数据,永不下载,主要用于本地数据缓存处理
NSURLRequestReloadRevalidatingCacheData = 5,//优先使用有效的缓存数据,如果失效再去请求新的数据
URLSession 三种工作模式
1. 默认模式: 和NSURLConnection 类似的工作方式, 依然采用硬盘作为请求的缓存机制, 将请求的缓存数据和用户信息存放在钥匙串中
2. 瞬时会话模式: 系统将网络请求的缓存数据和用户信息存储在RAM(寄存器中),一旦session 失效, 退出APP之后,将不再保留这些缓存数据, 用于临时会话
3. 后台工作模式: 用于支持APP处于非活跃状态的一些后台任务处理
创建session 配置(NSURLSessionConfiguration)
[NSURLSessionConfiguration defaultSessionConfiguration]; 默认模式
[NSURLSessionConfiguration ephemeralSessionConfiguration] 临时会话模式, 配置创建
[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"identify"]; 后台模式配置创建
URLSession 三种任务模式
1. NSURLSessionDataTask 普通的数据请求任务
2. NSURLSessionUploadTask 数据上传任务
3. NSURLSessionDownloadTask 数据下载任务
NSHTTPURLResponse的StatusCode
200 表示请求成功 可以正常处理
40X
400 表示参数错误,注意监测自己的资源参数部分
404 注意监测自己的 IP 地址写错; 如果IP地址没有错误,服务器端人员检查服务器的运行情况
50X 服务器异常
30X
302 303/304 :公司当中的接口有重定向的情况才会出现; 重定向指一次请求没法完成服务器处理时,需要重定向请求的操作
总结
一次HTTP网络请求的过程
1. 建立连接(通过三次握手完成)
a.由客户端(Client)发起第一次握手(报文)请求,告诉服务器(Server)准备处理请求
b.服务器(Server)接收到客户端(Client)的报文之后,准备处理链接请求并且会为这次链接分配资源,向客户端(Client) 发送确认报文(第二次握手)
c.客户端(Client) 接收到服务器(Server)的确认报文之后, 根据状态吗判断是否能够建立链接, 200 成功, 发送确认连接报文(第三次握手)
2. 进入数据传输阶段
3. 断开连接阶段(四次挥手)
例: 客户端(Client)先传输完毕
a.数据传输完毕之后,客户端(Client) 发起断开请求, 向服务器(Server)发送一个FIN(报文), 告诉服务器(Server)数据传输完毕,准备断开连接
b.服务器(Server)接收到客户端(Client) 的断开请求时, 向客户端(Client) 发送一个确认信息(ACK),告诉客户端(Client) 我(Server)已经收到你的断开请求,你(Client)可以进入等待断开连接状态
c.服务器(Server)数据传输结束之后, 向客户端(Client)发起一个断开请求FIN, 告诉客户端(Client), 我也传输完毕,准备断开
d.客户端(Client) 接受到Server 发送的FIN 之后, 确认可以断开了(等待断开状态), 向服务器(Server)发起一个ACK,确认可以断开了,服务器(Server)关闭连接
参考资料
TCP三次握手和四次挥手协议
TCP/IP四层模型和OSI七层模型的概念
核心代码
需要遵循协议
@interface ViewController ()
@property (nonatomic, strong) NSMutableData * data; //用于接受服务器端相应的数据
@end
// 需要实现的方法(在viewDidLoad 里直接调用)
// URLSession 网络请求, 采用协议方法回调
- (void)sessionWithDelegate{
// 用session 发起一个网络请求
// URL: 网络请求的目标路径
// http://10.0.8.8/sns/my/user_list.php?format=json&page=1&number=20
// http:// 表示请求要遵循的网络传输协议, 是HTTP协议
// 10.0.8.8 表示IP地址/ 主机名 / 域名
// 端口: 8080(默认的)
// 资源路径:/sns/my/user_list.php
// 资源参数:?format=json&page=1&number=20
NSString * urlStr = @"http://10.0.8.8/sns/my/user_list.php?format=json&page=1&number=20";
// 创建NSURL 对象
NSURL * url = [NSURL URLWithString:urlStr];
// 创建NSMutableURLRequest 请求对象 它是继承于 NSURLRequest
// 真正的请求发起者
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
// 设置请求方式 GET(查询)、POST(增加)、PUT(修改)、DELETE(删除)、TRACE、HEAD、OPTION 常用的是前 4 个
request.HTTPMethod = @"GET";
// 设置最长失效时间 (单位 是秒) 如果10s 还没有收到服务器的response 的消息,就请求超时
request.timeoutInterval = 10;
// 设置请求的缓存机制
[request setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData];
/*
NSURLRequestUseProtocolCachePolicy = 0, 协议缓存
NSURLRequestReloadIgnoringLocalCacheData = 1, // 忽略本地缓存
NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented // 忽略本地和远程的缓存,直接发起请求 (推荐使用)
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, // 忽略缓存
NSURLRequestReturnCacheDataElseLoad = 2, // 优先使用缓存数据, 如果没有再去发起网络请求
NSURLRequestReturnCacheDataDontLoad = 3, // 使用缓存数据, 永不下载 (主要本地数据处理)
NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented 优先使用有效的缓存数据, 如果失效,再去请求数据
*/
/*
session 三种工作模型
1. 默认模式: 和NSURLConnection 类似的工作方式, 依然采用硬盘作为请求的缓存机制, 将请求的缓存数据和用户信息存放在钥匙串中
2. 瞬时会话模式: 系统将网络请求的缓存数据和用户信息存储在RAM(寄存器中),一旦session 失效, 退出APP之后,将不再保留这些缓存数据, 用于临时会话
3. 后台工作模式: 用于支持APP处于非活跃状态的一些后台任务处理
*/
/*
创建session 配置
[NSURLSessionConfiguration defaultSessionConfiguration]; 默认模式
[NSURLSessionConfiguration ephemeralSessionConfiguration] 临时会话模式, 配置创建
[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"identify"]; 后台模式配置创建
*/
//1.默认模式
NSURLSessionConfiguration * configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
//临时会话模式, 配置创建
[NSURLSessionConfiguration ephemeralSessionConfiguration];
// 后台模式配置
[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"identify"];
// 创建管理线程执行的队列
NSOperationQueue * queue = [[NSOperationQueue alloc]init];
// 创建session 对象, 并设置为默认工作模式
NSURLSession * session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:queue];
// 发情请求,需要借助任务 -> 创建任务
/*
1. NSURLSessionDataTask 普通的数据请求任务
2. NSURLSessionUploadTask 数据上传任务
3. NSURLSessionDownloadTask 数据下载任务
*/
NSURLSessionDataTask * dataTask = [session dataTaskWithRequest:request];
// 启动任务
[dataTask resume]; // 发起请求, 第一次握手发起
//HTTP:面向连接的超文本传输文本, 是应用层网络协议,传输数据之前需要建立连接,通过三次握手建立连接
}
需要实现代理方法
//当接收到服务器端的响应时的回调方法(response 第二次握手)
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
//将接收到的响应,转换为针对HTTP的响应
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
//根据响应的状态码判断服务器是否能接收连接,处理你的请求
if(res.statusCode == 200){
/**
statusCode:
200 表示请求成功,可以正常处理
40X 400 表示参数错误,注意检测的资源参数部分,404 注意检测自己的IP地址是否写错,如果IP地址没有错误,服务器端人员检查服务的运行情况
50X:服务端异常
30X: 302 303/304 : 公司中的接口有需要重定向的情况,才会出现;重定向指一次请求没法完成服务处理时,需要重新定向请求的操作
*/
//开辟存储响应数据的空间
_data = [[NSMutableData alloc]init];
//运行请求操作继续,第三次握手发起
completionHandler(NSURLSessionResponseAllow);
}
NSLog(@"接收到服务器端的响应,让请求继续");
}
//接收到服务器端传输的数据时的回调方法
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
//按顺序拼接服务器传输的数据:数据一般分多次返回,每次返回的数据量跟当前的网络状态、和 服务器当前正在处理的请求个数有个
[_data appendData:data];
NSLog(@"接收到传输数据");
}
//网络请求结束
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
if(error == nil){
NSLog(@"网络请求处理成功");
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"获取的网络数据:%@",dict);
}else{
NSLog(@"网络请求处理失败");
}
}
//重定向(没有实现)
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler
{
//如果response的 statusCode 是 30X 的情况才写这个方法
//中途增加访问的的服务器
//需要新的目标路径
NSURL * url = [NSURL URLWithString:@"http://api.izhangchu.com/?methodName=HomeIndex"];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
NSLog(@"发起重定向请求");
//发起重定向请求
completionHandler(req);
}