Web Service使用的主要協(xié)議是HTTP協(xié)議,即超文本傳輸協(xié)議。
HTTP/1.1協(xié)議共定義了8種請求方法(OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT)作為Web服務(wù)器。
GET方法,是向指定的資源發(fā)送請求,請求的參數(shù)“顯式”地在URL的后面。有點像明信片,把內(nèi)容“顯式”寫在外面,因此安全性比較差。一般使用于讀取數(shù)據(jù)、例如從服務(wù)器讀取靜態(tài)圖片、或查詢數(shù)據(jù)等。
POST方法,是向指定資源提交數(shù)據(jù),請求服務(wù)器進行處理,數(shù)據(jù)包含在請求體中。參數(shù)和地址分開,放在body里面。有點像把信內(nèi)容放在信封中,接觸的人看不到,安全性比較高。一般用于例如提交表單、上傳文件等(請求的的動態(tài)資源,與查詢類似,每個方法調(diào)用都要傳遞很多參數(shù),因此需要使用NSMutableURLRequest創(chuàng)建請求。 )
iOS SDK中為HTTP請求提供了同步和異步請求這兩種不同的API,
同步請求,可以從因特網(wǎng)請求數(shù)據(jù),一旦發(fā)送同步請求,程序?qū)⑼V褂脩艚换ィ敝练?wù)器返回數(shù)據(jù)完成,才可以進行下一步操作,意味著線程阻塞;
異步請求,不會阻塞主線程,而會建立一個新的線程來操作,用戶發(fā)出異步請求后,依然可以對UI進行操作,程序可以繼續(xù)運行;
它們的主要區(qū)別在于連接方式的不同。
下面通過請求一個登陸接口介紹有關(guān)于網(wǎng)絡(luò)請求中的不同情況。
【本次開發(fā)環(huán)境: Xcode:7.2 ? ??iOS Simulator:iphone6 ? By:啊左】
一、GET方法
1.同步get方法:
//1.創(chuàng)建一個web路徑?
NSString*webPath=[NSString?stringWithFormat:@"http://172.16.2.254/php/phonelogin?name=%@&pass=%@&btn=login",yourname,yourpass]; ? ? ?
webPath=[webPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];?//url不允許為中文等特殊字符,需要進行字符串的轉(zhuǎn)碼為URL字符串,例如空格轉(zhuǎn)換后為“%20”;? ? ?
?NSURL *url=[NSURL URLWithString:webPath];? ? ??
//2.根據(jù)WEB路徑創(chuàng)建一個請求? ? ?
?NSURLRequest? *request=[NSURLRequest requestWithURL:url];? ? ? ? ?
NSURLResponse *respone;//獲取連接的響應(yīng)信息,可以為nil? ? ?
?NSError *error;? ? ? ? //獲取連接的錯誤時的信息,可以為nil? ??
//3.得到服務(wù)器數(shù)據(jù)? ??
NSData*data=[NSURLConnectionsendSynchronousRequest:requestreturningResponse:responeerror:&error];? ??
?if(data==nil)? ? {? ? ? ? NSLog(@"登陸失敗:%@,請重試",error);? ? ? ? return;? ? }?
?/*? ? ? ? 4.對服務(wù)器獲取的數(shù)據(jù)data進行相應(yīng)的處理;? */
2.異步get方法:
異步請求與同步請求的不同在于使用NSURLConnectionDataDelegate委托協(xié)議,指定代理.
@interface ViewController : UIViewController // 遵循協(xié)議
@property (weak,nonatomic) NSMutableData *receiveData;? //創(chuàng)建一個可變data,用于異步接收服務(wù)器的數(shù)據(jù)
@end
創(chuàng)建網(wǎng)絡(luò)請求:
//1.創(chuàng)建一個web路徑
NSString*webPath=[NSString stringWithFormat: @"http://172.16.2.254/php/phonelogin?name=%@&pass=%@&btn=login",yourname,yourpass];
webPath=[webPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL? *url=[NSURL URLWithString:webPath];
//2.根據(jù)WEB路徑創(chuàng)建一個請求
NSURLRequest *request=[NSURLRequest requestWithURL:url];
//3.指定代理 以異步的方式接收數(shù)據(jù)NSURLConnectionDataDelegate
NSURLConnection? *con=[NSURLConnection connectionWithRequest:request delegate:self];
if(con==nil)
{
NSLog(@"創(chuàng)建連接失敗.");
return;
}
else//成功 準(zhǔn)備接數(shù)據(jù)
{
if(self.receiveData==nil)
{
self.receiveData=[[NSMutableData alloc] init];
}
}
異步的代理行為:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{? ??
NSLog(@"已經(jīng)響應(yīng)成功.");
//清空 為當(dāng)前連接做準(zhǔn)備? ??
self.receiveData.length=0;
}
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{? ? NSLog(@"已經(jīng)接收到了數(shù)據(jù).");? ??
//追加接收到的數(shù)據(jù)? ??
[self.receiveData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{? ??
NSLog(@"接收數(shù)據(jù)已經(jīng)完成.");?
?/*? ? ? 對服務(wù)器獲取的數(shù)據(jù)receiveData進行相應(yīng)的處理;? */
}
-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{? ? NSLog(@"連接失敗.");
}
二、POST方法
1.同步post方法:
//1.創(chuàng)建一個web路徑? ??
NSString? *webPath=@"http://172.16.2.254/php/phoneloginpost.php"; ??
?webPath = [webPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];? ? NSURL *url=[NSURL URLWithString:webPath];
//2.建立一個帶協(xié)議緩存類型的請求 (使用NSMutableURLRequest,是post方法的關(guān)鍵)? ? NSMutableURLRequest? *request=[NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];? ? ? ? //3.設(shè)置表單提交的方法(默認(rèn)為get)? ? [requestsetHTTPMethod:@"post"];
//4.設(shè)置要提交的參數(shù)? ? NSString? *args=[NSString stringWithFormat:@"uname=%@&upas=%@&btn=login",uname,upas];? ? [requestsetHTTPBody:[args dataUsingEncoding:NSUTF8StringEncoding]];
NSData *recvData=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];? ? if(recvData!=nil)? ? {
/*
對服務(wù)器獲取的數(shù)據(jù)recvData進行相應(yīng)的處理
*/
}
else
{
NSLog(@"連接失敗,請重試!");
}
2.post方法的異步與同步的區(qū)別在于使用NSURLConnectionDataDelegate委托協(xié)議,指定代理.
這一點與get方法一致,所以就不進行長篇幅的演示了。
以上就是關(guān)于部分網(wǎng)絡(luò)同步異步請求,get、post請求方法的演示,由于UI控件還有其他的處理沒有附上,具體的讀者可以進行相應(yīng)細(xì)節(jié)的調(diào)整,進行完整的網(wǎng)絡(luò)請求項目開發(fā)。
由于iOS開始,引入了新的網(wǎng)絡(luò)接口NSURLSession,而在iOS9中NSURLConnection被宣布棄用,因此關(guān)于NSURLSession發(fā)送GET和POST請求的資料部分,有興趣的可以參考:
iOS開發(fā) GET、POST請求方法(NSURLSession篇)
(轉(zhuǎn)載請標(biāo)明原文出處,謝謝支持 ~ ^-^ ~)
? by:啊左~