您的位置:首页 > 理论基础 > 计算机网络

iOS网络通信http之NSURLConnection

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

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

1、异步请求

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

1)sendAsynchronousRequest

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

[cpp] view
plain copy

 print?

- (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方法,使用如下:

[cpp] view
plain copy

 print?

- (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、获取返回状态、包头信息。

[cpp] view
plain copy

 print?

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

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

[cpp] view
plain copy

 print?

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

3、接收数据

[cpp] view
plain copy

 print?

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;  

4、数据接收完毕

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

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

[html] view
plain copy

 print?

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、同步请求

同步请求数据方法如下:

[cpp] view
plain copy

 print?

- (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连接。异步请求和同步请求的区别是:创建了异步请求,用户可以做其他的操作,请求会在另一个线程执行,通信结果及过程会在回调函数中执行。同步请求则不同,需要请求结束用户才能做其他的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息