IOS開發筆記-NSURLConnection同步請求和異步請求以及get方法,post方法

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

    //創建URL

    NSURL *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










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章