iOS学习——iOS网络通信http之NSURLConnection(八)

简介:

      移动互联网时代,网络通信已是手机终端必不可少的功能。我们的应用中也必不可少的使用了网络通信,增强客户端与服务器交互。这一篇提供了使用NSURLConnection实现http通信的方式。

          NSURLConnection提供了异步请求、同步请求两种通信方式。

1、异步请求

       iOS5.0 SDK NSURLConnection类新增的sendAsynchronousRequest:queue:completionHandler:方法,从而使iOS5支持两种异步请求方式。我们先从新增类开始。


1)sendAsynchronousRequest

iOS5.0开始支持sendAsynchronousReques方法,方法使用如下:

- (void)httpAsynchronousRequest{      NSURL *url = [NSURL URLWithString:@"http://url"];          NSString *post=@"postData";          NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];      NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];     [request setHTTPMethod:@"POST"];     [request setHTTPBody:postData];     [request setTimeoutInterval:10.0];          NSOperationQueue *queue = [[NSOperationQueue alloc]init];     [NSURLConnection sendAsynchronousRequest:request                                        queue:queue                            completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){                                if (error) {                                    NSLog(@"Httperror:%@%d", error.localizedDescription,error.code);                                }else{                                                                        NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];                                                                        NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];                                                                        NSLog(@"HttpResponseCode:%d", responseCode);                                    NSLog(@"HttpResponseBody %@",responseString);                                }                            }];       } 

      sendAsynchronousReques可以很容易地使用NSURLRequest接收回调,完成http通信。

2)connectionWithRequest

iOS2.0就开始支持connectionWithRequest方法,使用如下:


- (void)httpConnectionWithRequest{          NSString *URLPath = [NSString stringWithFormat:@"http://url"];     NSURL *URL = [NSURL URLWithString:URLPath];     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];     [NSURLConnection connectionWithRequest:request delegate:self];      }  - (void)connection:(NSURLConnection *)theConnection didReceiveResponse:(NSURLResponse *)response {         NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];     NSLog(@"response length=%lld  statecode%d", [response expectedContentLength],responseCode); }   // A delegate method called by the NSURLConnection as data arrives.  The // response data for a POST is only for useful for debugging purposes, // so we just drop it on the floor. - (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data {     if (mData == nil) {         mData = [[NSMutableData alloc] initWithData:data];     } else {         [mData appendData:data];     }     NSLog(@"response connection"); }  // A delegate method called by the NSURLConnection if the connection fails. // We shut down the connection and display the failure.  Production quality code // would either display or log the actual error. - (void)connection:(NSURLConnection *)theConnection didFailWithError:(NSError *)error {          NSLog(@"response error%@", [error localizedFailureReason]); }  // A delegate method called by the NSURLConnection when the connection has been // done successfully.  We shut down the connection with a nil status, which // causes the image to be displayed. - (void)connectionDidFinishLoading:(NSURLConnection *)theConnection {     NSString *responseString = [[NSString alloc] initWithData:mData encoding:NSUTF8StringEncoding];      NSLog(@"response body%@", responseString); } 


   connectionWithRequest需要delegate参数,通过一个delegate来做数据的下载以及Request的接受以及连接状态,此处delegate:self,所以需要本类实现一些方法,并且定义mData做数据的接受。

需要实现的方法:


1、获取返回状态、包头信息。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

2、连接失败,包含失败。

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;


3、接收数据
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;


4、数据接收完毕

- (void)connectionDidFinishLoading:(NSURLConnection *)connection;


    connectionWithRequest使用起来比较繁琐,而iOS5.0之前用不支持sendAsynchronousRequest。有网友提出了AEURLConnection解决方案。

AEURLConnection is a simple reimplementation of the API for use on iOS 4. Used properly, it is also guaranteed to be safe against The Deallocation Problem, a thorny threading issue that affects most other networking libraries.

2、同步请求

同步请求数据方法如下:

- (void)httpSynchronousRequest{          NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];     NSURLResponse * response = nil;     NSError * error = nil;     NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest                                           returningResponse:&response                                                       error:&error];          if (error == nil)     {         // 处理数据     } }


同步请求数据会造成主线程阻塞,通常在请求大数据或网络不畅时不建议使用。


        从上面的代码可以看出,不管同步请求还是异步请求,建立通信的步骤基本是一样的:

         1、创建NSURL

         2、创建Request对象

         3、创建NSURLConnection连接。

         NSURLConnection创建成功后,就创建了一个http连接。异步请求和同步请求的区别是:创建了异步请求,用户可以做其他的操作,请求会在另一个线程执行,通信结果及过程会在回调函数中执行。同步请求则不同,需要请求结束用户才能做其他的操作。


/**
* @author 张兴业
*  iOS入门群:83702688
*  android开发进阶群:241395671
*  我的新浪微博:@张兴业TBOW
*/

参考:
http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-BAJEAIEE
http://codewithchris.com/tutorial-how-to-use-ios-nsurlconnection-by-example/
http://kelp.phate.org/2011/06/ios-stringwithcontentsofurlnsurlconnect.html

     本文转自xyz_lmn51CTO博客,原文链接: http://blog.51cto.com/xyzlmn/1230731 ,如需转载请自行联系原作者

相关文章
|
13天前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
49 3
|
24天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
49 13
|
23天前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
26天前
|
编解码 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(10-2):保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali——Liinux-Debian:就怕你学成黑客啦!)作者——LJS
保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali以及常见的报错及对应解决方案、常用Kali功能简便化以及详解如何具体实现
|
26天前
|
安全 网络协议 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-1):主动信息收集之ping、Nmap 就怕你学成黑客啦!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-1):主动信息收集之ping、Nmap 就怕你学成黑客啦!
|
26天前
|
网络协议 安全 NoSQL
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
|
26天前
|
人工智能 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(4-2):渗透测试行业术语扫盲完结:就怕你学成黑客啦!)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(4-2):渗透测试行业术语扫盲完结:就怕你学成黑客啦!)作者——LJS
|
26天前
|
安全 大数据 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(3-2):渗透测试行业术语扫盲)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(3-2):渗透测试行业术语扫盲)作者——LJS
|
26天前
|
SQL 安全 网络协议
网络空间安全之一个WH的超前沿全栈技术深入学习之路(1-2):渗透测试行业术语扫盲)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(1-2):渗透测试行业术语扫盲)作者——LJS
下一篇
无影云桌面