标签:
 移动互联网时代,网络通信已是手机终端必不可少的功能。我们的应用中也必不可少的使用了网络通信,增强客户端与服务器交互。这一篇提供了使用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);  
- }  
-   
-   
- - (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data  
- {  
-     if (mData == nil) {  
-         mData = [[NSMutableData alloc] initWithData:data];  
-     } else {  
-         [mData appendData:data];  
-     }  
-     NSLog(@"response connection");  
- }  
-   
- - (void)connection:(NSURLConnection *)theConnection didFailWithError:(NSError *)error  
- {  
-       
-     NSLog(@"response error%@", [error localizedFailureReason]);  
- }  
-   
- - (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连接。异步请求和同步请求的区别是:创建了异步请求,用户可以做其他的操作,请求会在另一个线程执行,通信结果及过程会在回调函数中执行。同步请求则不同,需要请求结束用户才能做其他的操作。
 
 
*  iOS入门群:83702688
*  android开发进阶群:241395671
*/
 
参考:
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
 
 
from:http://blog.csdn.net/xyz_lmn/article/details/8968182
【转】iOS学习笔记(八)——iOS网络通信http之NSURLConnection
标签:
原文地址:http://www.cnblogs.com/xuan52rock/p/5130225.html