移动互联网时代,移动通信已经使手机客户端必不可少的功能,我们的各种应用中也少不了网络通信,需要增强手机客户端和服务器之间的交换。本文讲介绍NSURLConnection中的同步请求,异步请求,get方法和post方法。
同步请求:数据会造成主线程阻塞,通常在大数据或者网络不畅的情况下不使用,会使用户与UI失去交互,出现程序的卡死,如果数据量少可以使用同步请求。
异步请求:异步请求不会阻塞主线程,会建立一个新的线程来做操作。
不管是异步请求还是同步请求,建立连接的步骤上虽然有所差别,但是不体上是一致的:
1、创建NSURL
2、创建Request对象
3、创建NSURLConnection连接
下面通过一些简单的例子做介绍:
1、#define URL @"http://www.baidu.com"
////////////////同步请求////////////////
//第一步:创建URL
NSURL *myURL=[NSURL URLWithString:URL];
//第二步:创建一个请求
NSURLRequest *myRequest=[NSURLRequest requestWithURL:myURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
//第三步:建立连接
NSURLResponse *myResponse=nil;
NSError *myErro=nil;
//向服务器发起请求(发起之后,线程会一直等待服务器响应,直到超出最大响应时间)
NSData *myData=[NSURLConnection sendSynchronousRequest:myRequest returningResponse:&myResponse error:&myErro];
NSLog(@"myData=%@",myData);//输出数据
NSLog(@"myErro=%@",[myErro localizedDescription]);//输出错误
2、异步请求///
//创建URLNSURL *myURL=[NSURL URLWithString:URL];
//创建请求
NSURLRequest *myRuquest=[NSURLRequest requestWithURL:myURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
//建立连接(异步的response在专门的代理协议中实现)
[NSURLConnection connectionWithRequest:myRuquest delegate:self];
异步加载数据需要下面几个方法常用的有四个方法:
#pragma mark URLConnectionDataDelegate
//接受服务器响应--接收到服务器回应的时候会执行该方法
-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
NSLog(@"服务器响应");
self.myData = [NSMutableData dataWithCapacity:5000];
}
//接收服务器数据--接收服务器传输数据的时候会调用,会根据数据量的大小,多次执行
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"服务器返回数据");
//将返回数据放入缓存区
[self.myData appendData:data];
}
//显示数据,直到所有的数据接收完毕
-(void) connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"数据接受完毕");
NSLog(@"myData=%@",self.myData);
}
//接受失败的时候调用的方法(断网或者是连接超时)
-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"数据接受失败,失败原因:%@",[error localizedDescription]);
}
3、
///////////////get请求/////////////////////
NSString *myStr=self.TextFieldQQ.text;
NSString *strUrl=[@"http://webservice.webxml.com.cn/webservices/qqOnlineWebservice.asmx/qqCheckOnline?qqCode=" stringByAppendingFormat:@"%@",myStr];
//创建URL
NSURL *myUrl=[NSURL URLWithString:strUrl];
//创建请求
NSURLRequest *myRequest=[NSURLRequest requestWithURL:myUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
//建立连接
[NSURLConnection connectionWithRequest:myRequest delegate:self];
4、
///post请求///////////////////////////////
NSString *postStr=@"http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx/qqCheckOnline";
NSURL *postUrl=[NSURL URLWithString:postStr];
NSMutableURLRequest *postRequest=[NSMutableURLRequest requestWithURL:postUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
//将参数做成字符串
NSString *postStr1=[NSString stringWithFormat: @"qqCode=%@",self.TextFieldQQ.text];
//转换成NSData
NSData *postData=[postStr1 dataUsingEncoding:NSUTF8StringEncoding];
//区别点,将参数作为Body体
[postRequest setHTTPBody:postData];
//必须手动声明当前的请求方式为POST(如果不设置,默认的是“GET”方法)
[postRequest setHTTPMethod:@"POST"];
//根据postRequest创建连接,以及执行的协议
[NSURLConnection connectionWithRequest:postRequest delegate:self];
GET请求:将参数直接写在访问路径上,如:@“http://webservice.webxml.com.cn/webservices/qqOnlineWebservice.asmx/qqCheckOnline?qqCode=”参数容易被外界看到,不安全
POST请求:将参数放在Body里面,如:@"http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx/qqCheckOnline"外界看不到参数,安全性比较高
注意:POST创建的NSURL是不带参数的,需要将请求的参数放入Body中,所以需要用NSMutableURLRequest来创建请求。
参考文章:http://blog.sina.com.cn/s/blog_7ad8771f0101ce5a.html
http://m.blog.csdn.net/blog/xyz_lmn/8968182