iOS上的http请求:get、post以及同步、异步

原创 2015年07月07日 01:39:22

1、get:

01.<span style="font-size:14px;">NSString * URLString = @"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=广东";
02.NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
03. 
04.NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL];
05.NSURLResponse * response = nil;
06.NSError * error = nil;
07.NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
08.if (error) {
09.NSLog(@"error: %@",[error localizedDescription]);
10.}else{
11.NSLog(@"response : %@",response);
12.NSLog(@"backData : %@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
13.}
14.</span>
get方法的请求参数是放在长长的URL字符串里面,这里只需要一个参数,就是地区的编号或名字,通过这个参数,服务器返回属于这个区域内支持天气查找的城市列表。如果有更多的参数也是放在URL字符串里面,至于参数的组织方式,就看服务器的要求了。

用字符串构建NSURL,最好在使用URLWithString的时候把原字符串进行一下UTF8转码,关于为何要转码,看下这里第一部分。然后NSURL对象构建NSURLRequest,使用NSURLConnection的同步方法,传入request对象就可以通过get方法获取数据。

这里有个NSError对象地址传入,用于做错误判断,网络的实际情况是多变的,必须要考虑请求错误的情况,否则可能导致程序奔溃。

2、post:

02.NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
03. 
04.NSString * postString = @"theRegionCode=广东";
05.NSData * postData = [postString dataUsingEncoding:NSUTF8StringEncoding];  //将请求参数字符串转成NSData类型
06. 
07.NSMutableURLRequest * request = [[NSMutableURLRequest alloc]init];
08.[request setHTTPMethod:@"post"]; //指定请求方式
09.[request setURL:URL]; //设置请求的地址
10.[request setHTTPBody:postData];  //设置请求的参数
11. 
12.NSURLResponse * response;
13.NSError * error;
14.NSData * backData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
15. 
16.if (error) {
17.NSLog(@"error : %@",[error localizedDescription]);
18.}else{
19.NSLog(@"response : %@",response);
20.NSLog(@"backData : %@",[[NSString alloc]initWithData:backData encoding:NSUTF8StringEncoding]);
21.}
post方式的时候参数是放在HTTPBody里面的,而且需要将字符串转码成响应的NSData类型,在接口文档里一般都有指出转码方式,需要按指定方式转码,这里的UTF8,也有gb2312的。request构建好了之后,和get方法一样使用NSURLConnection请求数据。

3、同步和异步请求:

一般网络请求都需要一段时间,哪怕数据再少、网络再好,都会有一段时间,而且很多时候必须考虑在网络不好的时候的app状态。使用同步请求只需安心等待数据就可以,不需要做额外操作,上面两例都是同步请求,connection调用方法后会把返回请求的数据,无需做什么其他事。但是同步会阻塞线程,如果通过点击button来发起请求,那么按钮会停留在highLight状态直到请求结束,会造成一种app卡住、死机的感觉,很不好。

异步get:

2.NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
3. 
4.NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL];
5. 
6._connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];  (1)
异步post类似,不再是使用NSURLConnection调用方法直接得到数据,而是使用(1)位置方法构建一个NSURLConnection对象,这个方法会默认开始请求数据。接下来关键就是靠委托了。因为请求的时间未知,所以使用委托模式的回调作用,在数据回来是调用协议方法。post和get委托方法处理一样。

协议方法:

要注意的是这里有两个委托:NSURLConnectionDataDelegate和NSURLConnectionDelegate,前一个继承于后一个,获取数据的方法是定义在前一个委托里面的,所以只要遵循NSURLConnectionDataDelegate就可以了。

一般用到四个委托方法:

01.<pre name="code" class="objc">//接受到respone,这里面包含了HTTP请求状态码和数据头信息,包括数据长度、编码格式等
02.-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ NSLog(@"response = %@",response); _backData = [[NSMutableData alloc]init];
03.}
04. 
05.//接受到数据时调用,完整的数据可能拆分为多个包发送,每次接受到数据片段都会调用这个方法,所以需要一个全局的NSData对象,用来把每次的数据拼接在一起
06.-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
07.[_backData appendData:data];
08.}
09. 
10.//数据接受结束时调用这个方法,这时的数据就是获得的完整数据了,可以使用数据做之后的处理了
11.-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
12.NSLog(@"%@",[[NSString alloc]initWithData:_backData encoding:NSUTF8StringEncoding]);
13.}
14. 
15.//这是请求出错是调用,错误处理不可忽视
16.-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
17.if (error.code == NSURLErrorTimedOut) {
18.NSLog(@"请求超时");
19.}
20.NSLog(@"%@",[error localizedDescription]);
21.}

最后,请求可以设置超时时间:
1.NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL cachePolicy:0 timeoutInterval:8.0];</span>
或者:
1.NSMutableURLRequest * request = [[NSMutableURLRequest alloc]initWithURL:URL];
2.[request setTimeoutInterval:8.0];
请求时间超过所设置的超时时间,会自动调用
1.-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
但是有个问题是怎么把判断是超时导致的请求失败,上面的例子里已经写了,可以根据返回的error的code进行判断。了解不同情况的请求失败,可以更好的给用户提示。
版权声明:本文为博主原创文章,未经博主允许不得转载。

IOS之同步请求、异步请求、GET请求、POST请求

1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依...
  • liulala16
  • liulala16
  • 2012年12月08日 09:23
  • 37904

iOS网络开发中的同步、异步和请求队列

在iOS网络编程中,我们经常会遇到线程的同步和异步问题,同时为了对异步请求更加精准丰富的控制,我们还常常在iOS中使用请求队列,下面就来谈谈iOS开发中同步、异步以及请求队列的使用方法。 1. 同步...
  • yangfan191218
  • yangfan191218
  • 2016年03月26日 11:45
  • 732

【Objective-C】Http常用API、同步请求与异步请求

开发iOS应用要调用Http接口、获取Http资源,有一套比较成熟的框架ASIHTTPRequest。而我还是比较喜欢使用原始一点的API,而它跟其他的面向对象语言有许多共通之处。本文分同步请求和异步...
  • rongxh7
  • rongxh7
  • 2014年02月28日 00:19
  • 7829

C# 中HttpClient的使用中同步异步问题

项目中遇到了这样的问题: 第一次 :HttpResponseMessage response = await httpClient.PostAsync(url, null);发送了一个post异步请求...
  • u010613052
  • u010613052
  • 2017年05月29日 13:08
  • 2928

Objective-C 之同步请求、异步请求、GET请求、POST请求

本篇文章由:http://www.sollyu.com/objective-c-synchronization-requests-requests-for-asynchronous-requests-...
  • kingsollyu
  • kingsollyu
  • 2015年01月05日 09:20
  • 3376

iOS原生Http请求,get post 异步

网上有个公开的天气接口:天气 ,点进其中的getSupportCityDataset接口,用这个接口为例写一下iOS上的HTTP请求的写法。 这里面提供了get、post请求的格式要求。 1、g...
  • qq_450351763
  • qq_450351763
  • 2016年05月31日 00:52
  • 2367

ios同步、异步、get与post请求介绍

  • 2013年03月16日 23:49
  • 47KB
  • 下载

iOS之同步请求、异步请求、GET请求、POST请求

  • 2014年07月23日 12:00
  • 34KB
  • 下载

ios网络学习------1get post异步请求

http://blog.csdn.net/huang2009303513/article/details/34848101 网络请求的步骤: get请求: [objc...
  • mituan1234567
  • mituan1234567
  • 2014年12月18日 17:48
  • 251

iOS同步 异步 get post 请求

1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后...
  • w527638232
  • w527638232
  • 2013年12月30日 12:11
  • 343
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS上的http请求:get、post以及同步、异步
举报原因:
原因补充:

(最多只允许输入30个字)