iOS 網路編程(HTTP 同步GET請求,同步POST請求,非同步GET請求,非同步POST請求)

來源:互聯網
上載者:User

  
下面首先介紹一下一些基本的概念---同步請求,非同步請求,GET請求,POST請求。

1、同步請求從網際網路請求資料,一旦發送同步請求,程式將停止使用者互動,直至伺服器返回資料完成,才可以進行下一步操作。也就是說同步就意味著阻塞線程,在同步請求過程中主線程中不響應其他事件直到同步請求結束。

2、非同步請求就不會阻塞主線程,而會建立一個新的線程來操作,使用者發出非同步請求後,依然可以進行其他動作,程式可以繼續運行。也就是說非同步不會阻塞主線程對其他事件的響應,所以使用者體驗大優於同步請求。

非同步請求會使用NSURLConnection委託協議NSURLConnectionDelegate,在請求的不同階段會回調不同的委派物件方法。

3、下面介紹一下GET和POST的區別(來自部落格http://www.cnblogs.com/wxf0701/archive/2008/08/17/1269798.html的介紹)

  HTTP定義了與伺服器互動的不同方法,最基本的方法是 GET 和 POST.

      HTTP-GET和HTTP-POST是使用HTTP的標準協議動詞,用於編碼和傳送變數名/變數值對參數,並且使用相關的請求語義。每個HTTP-GET和HTTP-POST都由一系列HTTP要求標頭組成,這些要求標頭定義了用戶端從伺服器請求了什麼,而響應則是由一系列HTTP應答頭和應答資料群組成,如果請求成功則返回應答。

      HTTP-GET以使用MIME類型application/x-www-form-urlencoded的urlencoded文本的格式傳遞參數。Urlencoding是一種字元編碼,保證被傳送的參數由遵循規範的文本組成,例如一個空格的編碼是"%20"。附加參數還能被認為是一個查詢字串。

 與HTTP-GET類似,HTTP-POST參數也是被URL編碼的。然而,變數名/變數值不作為URL的一部分被傳送,而是放在實際的HTTP請求訊息內部被傳送。

(1)get是從伺服器上擷取資料,post是向伺服器傳送資料。

(1)   在用戶端,Get方式在通過URL提交資料,資料在URL中可以看到;POST方式,資料放置在HTML
HEADER內提交。

(2) 對於get方式,伺服器端用Request.QueryString擷取變數的值,對於post方式,伺服器端用Request.Form擷取提交的資料。

(2)   GET方式提交的資料最多隻能有1024位元組,而POST則沒有此限制。

(3)   安全性問題。正如在(1)中提到,使用 Get 的時候,參數會顯示在地址欄上,而 Post 不會。所以,如果這些資料是中文資料而且是非敏感性資料,那麼使用 get;如果使用者輸入的資料不是中文字元而且包含敏感性資料,那麼還是使用 post為好。

簡而言之,GET請求,將參數直接寫在訪問路徑上。操作簡單,不過容易被外界看到,安全性不高;POST請求,POST請求操作相對複雜,需要將參數和地址分開,不過安全性高,參數放在body裡面,不易被捕獲。

下面代碼分別介紹這四種請求方式。

一、同步GET請求。

//第一步,建立URL    NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];    //第二步,通過URL建立網路請求    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy                                             timeoutInterval:10];    //第三步,串連伺服器,發送同步請求    NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];    NSString *str = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding];    NSLog(@"data is :%@",str);

二、同步POST請求。

//第一步,建立URL    NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do"];    //第二步,建立請求    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];    [request setHTTPMethod:@"POST"];//佈建要求方式為POST,預設為GET    //第三步,串連伺服器    NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];    NSString *str1 = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding];    NSLog(@"%@",str1);

注意到:NSMutableURLRequest  

NSMutableURLRequest is a subclass of NSURLRequest provided to aid developers who may find it more convenient to mutate a single request object for a series of URL load requests instead of creating an immutable
NSURLRequest for each load.

三、非同步GET請求

//第一步,建立url    NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];    //第二步,建立請求    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];    //第三步,串連伺服器    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];

實現代理方法:

//接收到伺服器回應的時候調用此方法- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{    NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;    NSLog(@"%@",[res allHeaderFields]);    self.receiveData = [NSMutableData data];    }//接收到伺服器傳輸資料的時候調用,此方法根據資料大小執行若干次-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{    [self.receiveData appendData:data];}//資料傳完之後調用此方法-(void)connectionDidFinishLoading:(NSURLConnection *)connection{    NSString *receiveStr = [[NSString alloc]initWithData:self.receiveData encoding:NSUTF8StringEncoding];    NSLog(@"%@",receiveStr);}//網路請求過程中,出現任何錯誤(斷網,連線逾時等)會進入此方法-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{    NSLog(@"%@",[error localizedDescription]);}

下面簡要說明一下代理方法中第一個方法的處理內容:

在didReceiveResponse方法中是 Returns all the HTTP header fields of the receiver.然後輸出顯示,結果如下:

 {    "Cache-Control" = "no-cache";    Connection = "Keep-Alive";    "Content-Type" = "text/xml; charset=utf-8";    Date = "Mon, 15 Apr 2013 12:37:54 GMT";    Expires = "Thu, 01 Jan 1970 00:00:00 GMT";    Pragma = "no-cache";    "Proxy-Connection" = "Keep-Alive";    Server = "nginx/0.7.61";    "Set-Cookie" = "JSESSIONID=947667669; domain=.baike.com; path=/, NSC_wt_bqj_ofx-hi=8efb37a6294c;expires=Mon, 15-Apr-13 11:31:28 GMT;path=/";    "Transfer-Encoding" = Identity;    Via = "1.1 WORKISA";}

四、非同步POST請求

//第一步,建立url    NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do"];    //第二步,建立請求    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];    [request setHTTPMethod:@"POST"];//佈建要求方式為POST,預設為GET    //第三步,串連伺服器    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];

代理方法實現如上非同步GET請求。

以上代碼部分轉載自http://blog.csdn.net/liulala16/article/details/8271673

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.