下面首先介紹一下一些基本的概念---同步請求,非同步請求,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