iOS原生Http请求,get post 异步

原创 2016年05月31日 00:52:26

网上有个公开的天气接口:天气 ,点进其中的getSupportCityDataset接口,用这个接口为例写一下iOS上的HTTP请求的写法。 这里面提供了get、post请求的格式要求。

1、get:

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

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

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

2、post:

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

3、同步和异步请求:

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

异步get:

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

协议方法:

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

一般用到四个委托方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<pre name="code" class="objc">//接受到respone,这里面包含了HTTP请求状态码和数据头信息,包括数据长度、编码格式等
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ NSLog(@"response = %@",response); _backData = [[NSMutableData alloc]init];
}
 
//接受到数据时调用,完整的数据可能拆分为多个包发送,每次接受到数据片段都会调用这个方法,所以需要一个全局的NSData对象,用来把每次的数据拼接在一起
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    [_backData appendData:data];
}
 
//数据接受结束时调用这个方法,这时的数据就是获得的完整数据了,可以使用数据做之后的处理了
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"%@",[[NSString alloc]initWithData:_backData encoding:NSUTF8StringEncoding]);
}
 
//这是请求出错是调用,错误处理不可忽视
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    if (error.code == NSURLErrorTimedOut) {
        NSLog(@"请求超时");
    }
    NSLog(@"%@",[error localizedDescription]);
}
</pre><br>
<pre class="brush:java;"></pre>
<pre class="brush:java;"></pre>
 
<p></p>
<pre class="brush:java;"></pre>
   最后,请求可以设置超时时间:<pre class="brush:java;">NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL cachePolicy:0 timeoutInterval:8.0];</pre>或者:<pre class="brush:java;">NSMutableURLRequest * request = [[NSMutableURLRequest alloc]initWithURL:URL];
 [request setTimeoutInterval:8.0];</pre>请求时间超过所设置的超时时间,会自动调用<pre class="brush:java;">-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error</pre>但是有个问题是怎么把判断是超时导致的请求失败,上面的例子里已经写了,可以根据返回的error的code进行判断。了解不同情况的请求失败,可以更好的给用户提示。<br>
<br>
<p></p> 

iOS 原生网络请求写法

//网络请求     NSURLSession * mySession = [NSURLSession sharedSession];     NSURL * fullURL = [NS...

iOS 【原生API NSURLConnection 网络请求】

原生API NSURLConnection 网络请求

iOS 原生NSURLSession 简单的 GET、POST 请求

简单的使用iOS原生的NSURLSession 简单的封一个get,post 短数据网络请求,纯属个人意见,如有错误请指教。...

iOS-原生网络请求

用多了AFN难免对苹果底层的网络请求陌生了许多,编程所谓一天不敲就手生,尝试几种原生网络请求方法,和大家共享…普及: URL Session的基本概念1.三种工作模式:默认会话模式(default)...

iOS开发网络篇—发送GET和POST请求(使用NSURLSession)

1)该文主要介绍如何使用NSURLSession来发送GET请求和POST请求   2)本文将不再讲解NSURLConnection的使用,如有需要了解NSURLConnection如何发送请求。 ...

iOS9 以后的POST请求

// iOS 9以后     // 1、 创建URL     NSURL *urls = [NSURL URLWithString:@""];     // 2、  ...
  • saw471
  • saw471
  • 2016年08月26日 19:14
  • 842

iOS网络编程————POST请求和GET请求

iOS网络编程内容很多,也很重要,小编慢慢总结,慢慢来讲。 iOS的网络编程主要涉及两者:客户端和服务器端,上传和下载数据都是客户端通过访问服务器端来实现的。 服务器端开发语言有Java,.Net,C...

ios开发网络篇—POST请求(项目中用到的)

// 1.设置请求路径     NSURL *URL=[NSURL URLWithString:serverHTTP];//不需要传递参数          //    2.创建请求...

IOS #define和预编译指令

预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。 预处理指令是以#开头的代码行,#后是指令关键字,在关键字和#号之间允许存在任意个...

collectionView一些注意的地方

@required - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NS...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS原生Http请求,get post 异步
举报原因:
原因补充:

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