iOS网络通信-->NSURLSession
NSURLSession,是在iOS7.0之后,Apple推出用来替代NSURLConnection的系统类。我们可以使用NSURLSession很容易的处理网络通信中的两种请求方法GET和POST,有关这两种请求方法的区别,感兴趣的戳这里 ⬇️
http://www.w3school.com.cn/tags/html_ref_httpmethods.asp
在NSURLSession 中,我们可以实现GET和POST两种请求方式,而每一种请求方式,都可以用两种手段来实现 block方式和协议代理的方式,采用block方式特点是简单,只需一个方法,在其后面的block回调中,就可以拿到我们请求的数据,而使用delegate的方式,可以使我们精确操控每一步,从 server响应连接--> client开始接收数据 -->client请求数据完成,每一步里,我们都可以实现一些额外的功能方法。
在这里只是简单粗暴的展示使用方法,可以快速的完成功能需求,不涉及细节研究。下面会出现几个概念,简单说一下
NSURLSession 是整个工具类的一个对象
NSURLSessionDataTask 继承自NSURLSessionTask,指明你的任务类型
1.GET 请求(block方式获得数据)
//通过单例得到session对象 (好多工具类,我们在整个app中只需要一个,所以就经常使用单例这种设计模式)
NSURLSession *session = [NSURLSession sharedSession];
//url对象
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
//建立任务 在这里我们选择的是通过URL初始化一个task对象
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//block参数中的data对象,就是我们所需要的数据,在block中,我们就可以按照自己的需求使用数据
NSString *resultStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"----%@",resultStr);
}];
//启动任务 这一步很关键哦,不要看它短
[dataTask resume];
}
是不是很简单?
2.POST请求 (block方式)
和GET请求的方式差不多,GET请求的参数(数据),是拼接在url地址后面,而到了POST请求,我们把参数(数据),塞在POST请求的body内,所以我们就需要NSMutableURLRequest对象,设置该对象,并且使用该对象作为参数,初始化我们的task任务
- (void)sessionPost{
//得到session对象
NSURLSession *session = [NSURLSession sharedSession];
//得到url
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"];
//创建请求对象 使用可变对象 Mutable 啊
NSMutableURLRequest *mRequest = [[NSMutableURLRequest alloc] initWithURL:url];
//设置请求方式 我们声明这是一个POST请求
[mRequest setHTTPMethod:@"POST"];
//组装数据 参数,其实就是我们的数据
NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];
//添加数据 塞进肚子里
[mRequest setHTTPBody:pData];
//创建Datatask任务
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:mRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//处理数据
NSString *resultStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",resultStr);
}];
//启动任务
[dataTask resume];
}
3.GET请求 (delegate 协议代理方式)
在上面的两种请求方式中,我们都使用单例得到NSURLSession对象,而在delegate模式下,我们使用的是便利构造器的方式
- (void)sessionDelegate{
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
//下面使用的是NSURLRequest ,我们也可以使用NSMutableURLRequest进行POST请求
NSURLSessionDataTask *task = [session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"]]];
[task resume];
}
服务器开始响应,准备返回数据 ,在此方法里面我们可以初始化我们的数据接收容器
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
completionHandler(NSURLSessionResponseAllow);
//当网络请求是基于http协议时,response的本质是NSHTTPURLResponse类型
NSHTTPURLResponse *heepResponse = (NSHTTPURLResponse *)response;
//打印状态码 200 、404 之类的
NSLog(@"%ld",heepResponse.statusCode);
//接收容器是可变类型的
self.mData = [[NSMutableData alloc] init];
}
客户端接收数据 ,此方法会多次执行,所以我们需要可变容器来接收,一个劲的往后拼接新数据
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
[self.mData appendData:data];
}
数据请求完成,网络请求成功
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
NSString *result = [[NSString alloc] initWithData:self.mData encoding:NSUTF8StringEncoding];
NSLog(@"%@",result);
}
这就是我们使用系统的NSURLSession进行网络通信的方法,而目前有好多人使用第三方AFNetworking,其实也就是对NSURLSession进行了封装,Ps:AFNetworking在iOS7.0之前,应该是封装的NSURLConnection,在iOS7.0之后,也跟随了Apple的步伐 ,做出了更新。