NEtWorking_四种数据请求方法
2015-09-15 20:59
267 查看
ViewController.m
#import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> //用来拼接数据 @property (nonatomic,strong) NSMutableData * appendData; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } /* 同步和异步的区别 同步:主要是指客户端在发送请求后,必须得在服务端有回应后才发送下一个请求。所以这个时候的所有请求将会在服务端得到同步 异步:指客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求,这样对于所有的请求动作来说将会在服务端得到异步,这条请求的链路就象是一个请求队列,所有的动作在这里不会得到同步的。 */ /* get和post区别: get会显示所有信息,在URL上显示 post会把信息放在一个body里,看不见(但只是所谓的安全,最好的安全师抓到包(获取信息)也没有用) */ #pragma mark -- 一下四个都是button点击事件 //get同步(不常用) //容易出现假死现象(不能进行任何操作) -(IBAction)getSync:(id)sender { NSLog(@"get同步"); // 1.准备url(全国统一定位符) // 这个string是地址 // ? 的后面是参数,用 & 隔开; = 前面是变量名,后面是参数(可改变) NSString * urlStr = @"http://172.21.8.5/?userName=yan3&password=123"; NSURL * url = [NSURL URLWithString:urlStr]; // 2.创建请求对象 NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:30]; // 设置 // 默认就是GET [request setHTTPMethod:@"GET"]; // 3.创建响应对象(目的接收响应) // 这里没必要创建值,因为请求回来是会给他一个值 NSURLResponse * response = nil; // 4.创建错误对象 NSError * error = nil; // 5.发送请求,建立连接,接收(数据 || 响应 || 错误) // 巨大问题:有可能出现假死现象:所有UI程序停下来等他响应完成 NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; NSLog(@"data : %@",data); NSLog(@"response : %@",response); NSLog(@"error : %@",error); } //get异步(一定要掌握) - (IBAction)getAsyn:(id)sender { NSLog(@"get异步"); // 1.准备url NSString * urlStr = @"http://172.21.8.5/?userName=yan3&password=123"; NSURL * url = [NSURL URLWithString:urlStr]; // 2.创建请求对象 NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; // 异步不需要创建响应和错误 // 3.发送请求建立连接(代理) NSURLConnection * conn = [NSURLConnection connectionWithRequest:request delegate:self]; // 4.启动 [conn start]; // 5.取消(不要在这写) // [conn cancel]; } //post同步 - (IBAction)postSync:(id)sender { NSLog(@"post同步"); // 1.准备url // 这的参数就不要了,写在下面3. NSString * urlStr = @"http://172.21.8.5/"; NSURL * url = [NSURL URLWithString:urlStr]; // 2.准备请求对象 NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; // 3.准备参数 NSString * paramStr = [NSString stringWithFormat:@"userName=yan3&password=123"]; // 将参数转换成NSData类型 NSData * paramData = [paramStr dataUsingEncoding:NSUTF8StringEncoding]; // 添加参数 [request setHTTPBody:paramData]; // 4.发送请求,建立连接 NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSLog(@"data:%@",data); // 5.解析 // 崩溃信息:reason: 'data parameter is nil' (说明接收到空信息,但是又解析了) // id temp = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil]; // 加这些判断,可以减少程序蹦的概率 if (data != nil) { id temp = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil]; NSLog(@"%@",temp); }else{ NSLog(@"网络故障,没有数据"); } } //post异步(一定要掌握) - (IBAction)postAsyn:(id)sender { NSLog(@"post异步"); // 1.准备URL NSString * urlStr = @"http://172.17.32.53/"; NSURL * url = [NSURL URLWithString:urlStr]; // 2.创建请求对象 NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:30]; // post类型的请求 [request setHTTPMethod:@"POST"]; // 3.准备参数 NSString * paramStr = @"userName=yan3&password=123"; // 转换成NSData类型 // 转成NSUTF8这种格式 NSData * paramData = [paramStr dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPBody:paramData]; // 4.发送请求,建立连接 (get异步也可以用这个) // queue:[NSOperationQueue mainQueue] 是个操作队列,跟多线程有关 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { }]; NSLog(@"%@",paramData); } //只有get异步用 #pragma mark -- NSURLConnectionDataDelegate 协议方法 //1.已经接收到响应 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ // 马上开始传数据了 // response中包含了数据信息 // 初始化 _appendData = [NSMutableData data]; } //2.接收到数据 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ //这个数据不是一次性传完.这个方法会走多次 // 我们要将data拼接起来 [self.appendData appendData:data]; } // 3 数据接收完毕 -(void)connectionDidFinishLoading:(NSURLConnection *)connection{ //接收好数据,处理。 //解析(异步get) //将接收到的数据转换为字符串类型的,然后输出 NSString * receiveStr = [[NSString alloc]initWithData:self.appendData encoding:NSUTF8StringEncoding]; NSLog(@"%@",receiveStr); } // 4 请求发生错误 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ NSLog(@"%@",[error localizedDescription]); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
相关文章推荐
- Linux信号编程实践(一) 信号概述
- linux /boot FHS翻译
- IOS GoodsModel 详解
- CCF-命令行选项-201403-3
- +【CSS3】使用纯css代码实现图片轮播效果
- Java中抽象类和接口的区别
- 指针常量和常量指针
- BZOJ 1097 [POI2007]旅游景点atr dijikstra+状压DP
- Missing Number @leetcode
- unicode码的分布情况
- Java学习之利用集合发牌小练习
- 数据结构-栈
- 浮躁的过去,开启的项目管理之路(一)
- Oracle学习笔记20150915常见循环语句以及goto语句
- TCP协议三次握手
- [Unity3D]Unity3D游戏开发之在Android视图中嵌入Unity视图
- Leftmost Digit
- SQL占用CPU100%
- NEtWorking_四种数据请求方式
- Android 五种存储方式个人总结