iOS开发 ----- 网络请求2 ----- 请求数据
2015-09-26 18:56
681 查看
NSURLSession请求数据
系列导航
网络请求1 —> 概览网络请求2 —> 请求数据
网络请求3 —> 上传数据
网络请求4 —> 下载数据以及断点续传
前边BB了那么多,下边该看看应该怎么实现了,分为GET请求和POST请求,然后用分别用代理和block来实现,也就是说将有4段程序,截图就不贴了,每什么好截的,控制台打印,数据明明白白的
1.GET
1.1 GET –> block实现
必须调用resume方法,否则不会请求 所谓的block也就是在下边completionHandler这个block中编写请求数据的处理,是要存储模型还是干什么
代码部分
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //调用 [self getDataWithBlock]; } -(void)getDataWithBlock { //请求的地址 NSString * path = @"http://10.0.8.8/sns/my/user_list.php"; //转为URL NSURL * url = [NSURL URLWithString:path]; //初始化请求对象 NSURLRequest * request = [NSURLRequest requestWithURL:url]; //初始化配置 NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration]; //配置session NSURLSession * session = [NSURLSession sessionWithConfiguration:config]; //初始化请求任务,以及请求完成之后要做的事 NSURLSessionDataTask * task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { //解析JSON NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; //打印 NSLog(@"%@",dict); }]; //开始请求 [task resume]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
1.2 GET –> delegate实现
和block请求方式类似,不过可以更加详细的看到相关的信息,如响应的头部信息,以及追加数据等等,相对block来说,会麻烦一点
#import "ViewController.h" @interface ViewController ()<NSURLSessionDataDelegate> @end @implementation ViewController { NSMutableData * _data; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self getDataWithDelegate]; } -(void)getDataWithDelegate { //初始化数据容器 _data = [[NSMutableData alloc]init]; //请求的地址 NSString * path = @"http://10.0.8.8/sns/my/user_list.php"; //转为URL NSURL * url = [NSURL URLWithString:path]; //初始化请求对象 NSURLRequest * request = [NSURLRequest requestWithURL:url]; //初始化配置 NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration]; //配置session,指定代理 NSURLSession * session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; //初始化任务 NSURLSessionDataTask * task = [session dataTaskWithRequest:request]; //开始请求 [task resume]; } #pragma mark -- 收到响应时候所做的事情 -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler { NSLog(@"%@",response); //一定要调用这个方法,否则不能请求数据 completionHandler(NSURLSessionResponseAllow); } #pragma mark -- 收到数据时调用的方法 -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { //追加数据 [_data appendData:data]; } #pragma mark -- 请求完成时候调用的方法 -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { if (error) { NSLog(@"%@",error); }else { //解析数据 NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil]; NSLog(@"%@",dict); } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
2.POST
2.1 POST –> block实现
多了一点,request转为可变的,然后配置为POST即可,其他方式等同于GET请求
POST多了以点加密的功能,POST提交的数据时不可见的,所以,相对来说,性能上会损失一点
#import "ViewController.h" @interface ViewController ()<NSURLSessionDataDelegate> @end @implementation ViewController { NSMutableData * _data; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self getDataWithBlock]; } -(void)getDataWithBlock { //请求的地址 NSString * path = @"http://10.0.8.8/sns/my/user_list.php"; //转为URL NSURL * url = [NSURL URLWithString:path]; //初始化请求对象 NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; //设置为POST请求 request.HTTPMethod = @"POST"; //初始化配置 NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration]; //配置session NSURLSession * session = [NSURLSession sessionWithConfiguration:config]; //初始化请求任务,以及请求完成之后要做的事 NSURLSessionDataTask * task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"%@",response); //解析JSON NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; //打印 NSLog(@"%@",dict); }]; //开始请求 [task resume]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
2.2 POST –>代理方式
和GET几乎是一样的,多了一点,request转为可变的,然后配置为POST即可,其他方式等同于GET请求
POST多了以点加密的功能,POST提交的数据时不可见的,所以,相对来说,性能上会损失一点
#import "ViewController.h" @interface ViewController ()<NSURLSessionDataDelegate> @end @implementation ViewController { NSMutableData * _data; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self getDataWithDelegate]; } -(void)getDataWithDelegate { //初始化数据容器 _data = [[NSMutableData alloc]init]; //请求的地址 NSString * path = @"http://10.0.8.8/sns/my/user_list.php"; //转为URL NSURL * url = [NSURL URLWithString:path]; //初始化请求对象 NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; //配置为post请求 request.HTTPMethod = @"POST"; //初始化配置 NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration]; //配置session NSURLSession * session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; //初始化任务 NSURLSessionDataTask * task = [session dataTaskWithRequest:request]; //开始请求 [task resume]; } #pragma mark -- 收到响应时候所做的事情 -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler { NSLog(@"%@",response); //一定要调用这个方法,否则不能请求数据 completionHandler(NSURLSessionResponseAllow); } #pragma mark -- 收到数据时调用的方法 -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { //追加数据 [_data appendData:data]; } #pragma mark -- 请求完成时候调用的方法 -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { if (error) { NSLog(@"%@",error); }else { NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil]; NSLog(@"%@",dict); } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
相关文章推荐
- iOS开发 ----- 网络请求1 ----- 概览
- Android网络编程之搭建一个属于你自己的简单servlet服务端。
- Web压力测试工具:http_load、webbench、ab、Siege使用方法
- Swift - 异步获取网络数据封装类
- JavaSE--- 网络编程
- 2015上海网络赛 HDU 5478 Can you find it 数学
- 2015上海网络赛 HDU 5475 An easy problem 线段树
- 2015 上海网络赛
- Samba网络文件共享服务介绍
- 第2章 TCP/IP基础知识
- 5中服务器的网络编程
- c++调用winhttp对象
- iOS中一种网络层与业务层的设计方案
- Linux网络虚拟化与MLPPP多链路
- 2015亚洲网络赛上海站1010A Sweet Journey
- Python学习(8)---Scrapy框架下的网络爬虫
- HTTP/HTTPS协议详解
- 左右HttpClient上传的方法来解决中国的乱码
- java中TCP之TCP实现
- 《深入理解Linux网络技术内幕》阅读笔记(五)