1、get:
view source
01.<span style="font-size:14px;">NSString * URLString = @"?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:
view source
01.NSString * URLString = @"";
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:
view source
1.NSString * URLString = @"?theRegionCode=广东";
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就可以了。
一般用到四个委托方法:
view source
01.<pre name="code"class="objc">//接受到respone,这里面包含了HTTP请求状态码和数据头信息,包括数据长度、编码格式等
愚者用肉体监视心灵,智者用心灵监视肉体