NSURLSession (一) 采用协议方法回调

这一篇记录的是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);
}

你可能感兴趣的:(NSURLSession (一) 采用协议方法回调)