移動互聯網時代,移動通信已經使手機客戶端必不可少的功能,我們的各種應用中也少不了網絡通信,需要增強手機客戶端和服務器之間的交換。本文講介紹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