iOS開發(fā) GET、POST請求方法(NSURLConnection篇)

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:啊左~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容