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

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

1、异步请求

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

1)sendAsynchronousRequest

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

  1. - (void)httpAsynchronousRequest{
  2. NSURL *url = [NSURL URLWithString:@"http://url"];
  3. NSString *post=@"postData";
  4. NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
  5. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  6. [request setHTTPMethod:@"POST"];
  7. [request setHTTPBody:postData];
  8. [request setTimeoutInterval:10.0];
  9. NSOperationQueue *queue = [[NSOperationQueue alloc]init];
  10. [NSURLConnection sendAsynchronousRequest:request
  11. queue:queue
  12. completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
  13. if (error) {
  14. NSLog(@"Httperror:%@%d", error.localizedDescription,error.code);
  15. }else{
  16. NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
  17. NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  18. NSLog(@"HttpResponseCode:%d", responseCode);
  19. NSLog(@"HttpResponseBody %@",responseString);
  20. }
  21. }];
  22. }

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

2)connectionWithRequest

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

  1. - (void)httpConnectionWithRequest{
  2. NSString *URLPath = [NSString stringWithFormat:@"http://url"];
  3. NSURL *URL = [NSURL URLWithString:URLPath];
  4. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
  5. [NSURLConnection connectionWithRequest:request delegate:self];
  6. }
  7. - (void)connection:(NSURLConnection *)theConnection didReceiveResponse:(NSURLResponse *)response
  8. {
  9. NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
  10. NSLog(@"response length=%lld  statecode%d", [response expectedContentLength],responseCode);
  11. }
  12. // A delegate method called by the NSURLConnection as data arrives.  The
  13. // response data for a POST is only for useful for debugging purposes,
  14. // so we just drop it on the floor.
  15. - (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data
  16. {
  17. if (mData == nil) {
  18. mData = [[NSMutableData alloc] initWithData:data];
  19. } else {
  20. [mData appendData:data];
  21. }
  22. NSLog(@"response connection");
  23. }
  24. // A delegate method called by the NSURLConnection if the connection fails.
  25. // We shut down the connection and display the failure.  Production quality code
  26. // would either display or log the actual error.
  27. - (void)connection:(NSURLConnection *)theConnection didFailWithError:(NSError *)error
  28. {
  29. NSLog(@"response error%@", [error localizedFailureReason]);
  30. }
  31. // A delegate method called by the NSURLConnection when the connection has been
  32. // done successfully.  We shut down the connection with a nil status, which
  33. // causes the image to be displayed.
  34. - (void)connectionDidFinishLoading:(NSURLConnection *)theConnection
  35. {
  36. NSString *responseString = [[NSString alloc] initWithData:mData encoding:NSUTF8StringEncoding];
  37. NSLog(@"response body%@", responseString);
  38. }

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

需要实现的方法:

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

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

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

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

3、接收数据

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

4、数据接收完毕

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

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

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

同步请求数据方法如下:

  1. - (void)httpSynchronousRequest{
  2. NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];
  3. NSURLResponse * response = nil;
  4. NSError * error = nil;
  5. NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
  6. returningResponse:&response
  7. error:&error];
  8. if (error == nil)
  9. {
  10. // 处理数据
  11. }
  12. }

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

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

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
 
from:http://blog.csdn.net/xyz_lmn/article/details/8968182

【转】iOS学习笔记(八)——iOS网络通信http之NSURLConnection的更多相关文章

  1. iOS学习笔记(八)——iOS网络通信http之NSURLConnection

    转自:http://blog.csdn.net/xyz_lmn/article/details/8968182 移动互联网时代,网络通信已是手机终端必不可少的功能.我们的应用中也必不可少的使用了网络通 ...

  2. iOS学习笔记(四)——iOS应用程序生命周期

    开发应用程序都要了解其生命周期,开始接触android时也是从应用程序生命周期开始的,android的应用程序生命周期更多是其组件的生命周期,例如Activity.Service.今天我们接触一下iO ...

  3. iOS学习笔记:iOS核心动画中的常用类型

    CATransaction 当我们在自定义的图层上修改某些支持动画的属性时,系统会为该属性的修改自动产生动画.这种其实属于隐式动画.隐式动画要得益于CATransaction. 一个CATransac ...

  4. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  5. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  6. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  7. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  8. IOS学习笔记之关键词@dynamic

    IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...

  9. iOS学习笔记10-UIView动画

    上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...

随机推荐

  1. 洛谷P3819 松江1843路

    P3819 松江1843路 题目描述 涞坊路是一条长L米的道路,道路上的坐标范围从0到L,路上有N座房子,第i座房子建在坐标为x[i]的地方,其中住了r[i]人. 松江1843路公交车要在这条路上建一 ...

  2. EIGRP-8-路由器的邻接关系

    EIGRP路由器之间会建立并维护邻接关系.EIGRP在默认情况下会动态发现邻居路由器.也可以通过工程师手动配置(静态)发现邻居.   通过向目的组播组地址224.0.0.10或FF02: : A发送E ...

  3. STP-18-Port-Channl上的负载均衡

    Ether Channel通过在多条链路上传输多个数据帧,增加了可用带宽.一个以太网帧总是通过一个Ether Channel中的一条链路传输.针对数据帧地址字段执行散列计算能够产生一个编号,标识这个数 ...

  4. POJ1027 The Same Game

    题目来源:http://poj.org/problem?id=1027 题目大意: 题目说的就是现在蛮流行的手机小游戏popstar,求用贪心方法能得到多少分. 小球有三种颜色:R/G/B.横向.纵向 ...

  5. POJ 3321 Apple Tree DFS序 + 树状数组

    多次修改一棵树节点的值,或者询问当前这个节点的子树所有节点权值总和. 首先预处理出DFS序L[i]和R[i] 把问题转化为区间查询总和问题.单点修改,区间查询,树状数组即可. 注意修改的时候也要按照d ...

  6. 【JavaEE】tomcat部署项目的几种方式 .

    一.静态部署1.直接将web项目文件件拷贝到webapps 目录中     Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用.所以可以将JSP程 ...

  7. Java微信公众平台开发(十)--微信用户信息的获取

    前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关 ...

  8. phpize使用方法

    phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块,下面介绍一个它的使用方法,需要的朋友可以参考下 安装(fastcgi模式)的时候,常常有这样一句命令: 代码如下: / ...

  9. 解决pyhton aiohttp ssl:None [[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)

    解决pyhton aiohttp ssl:证书报错问题, 错误信息> Cannot connect to host oapi.dingtalk.com:443 ssl:None [[SSL: C ...

  10. windows下使用VM虚拟机安装linux

    转载地址:http://blog.csdn.net/u013142781/article/details/50529030 安装过程中发现与下面的顺序有点不同,遇到的问题是: 在选择中文进行安装时,一 ...