1、iOS網(wǎng)絡(luò)基礎(chǔ)講師:劉凡技術(shù)博客: 百度一下,你就知道百度搜索網(wǎng)絡(luò)請求的兩種方式GET & POSTGET & POST的HTML訪問演示網(wǎng)絡(luò)請求之 GET vs POST有兩種方法把數(shù)據(jù)提交給服務(wù)器:GET和POSTGETGET的語義是獲取指定URL上的資源將數(shù)據(jù)按照variable=value的形式,添加到action所指向的URL后面,并且兩者使用“?”連接,各個(gè)變量之間使用“&”連接不安全,因?yàn)樵趥鬏斶^程中,數(shù)據(jù)被放在請求的URL中傳輸?shù)臄?shù)據(jù)量小,這主要是因?yàn)槭躑RL長度限制POSTPOST的語意是對指定資源“追加/添加”數(shù)據(jù)將數(shù)據(jù)放在數(shù)據(jù)體中,按照變量和值相對應(yīng)的方式,傳遞到acti
2、on所指向URL所有數(shù)據(jù)對用戶來說不可見可以傳輸大量數(shù)據(jù),上傳文件只能使用Post網(wǎng)絡(luò)訪問步驟示意圖(1)網(wǎng)絡(luò)訪問步驟示意圖(2)網(wǎng)絡(luò)訪問的四個(gè)步驟第一步:確定地址URL第二步:建立請求第三步:開始連接等待網(wǎng)絡(luò)處理中第四步:連接完成,處理結(jié)果iOS網(wǎng)絡(luò)處理常用類NSURL(地址)請求地址NSURLRequest(請求,GET請求使用)保存需要傳送給Web服務(wù)器的全部數(shù)據(jù):一個(gè)NSURL對象緩存策略等待Web服務(wù)器響應(yīng)的最長時(shí)間請求頭請求體NSMutableURLRequest(可變請求,POST請求使用)NSURLRequest的可修改子類NSURLConnection(連接)負(fù)責(zé)創(chuàng)建客戶端和
3、Web服務(wù)器之間的網(wǎng)絡(luò)連接、發(fā)送NSURLRequest對象中的數(shù)據(jù)并收集來自服務(wù)器的響應(yīng)NSURLConnectionDataDelegate的常用代理方法之所以使用代理方法,是因?yàn)橐幚碚埱蠓祷氐慕Y(jié)果!/ 服務(wù)器開始返回?cái)?shù)據(jù)(void)connection:didReceiveResponse:/ 收到服務(wù)器返回的數(shù)據(jù),本方法會被調(diào)用多次- (void)connection:didReceiveData:/ 數(shù)據(jù)接收完畢,做數(shù)據(jù)的最后處理(void)connectionDidFinishLoading:/ 網(wǎng)絡(luò)連接錯(cuò)誤- (void)connection:didFailWithError:
4、/ 發(fā)送數(shù)據(jù)給服務(wù)器,POST 請求使用此方法- (void)connection:didSendBodyData:totalBytesWritten: totalBytesExpectedToWrite:GET請求步驟1. 地址 2.請求 3.連接定義URLNSString *urlStr = ;NSURL *url = NSURL URLWithString:urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding;定義RequestNSURLRequest *request = NSURLRequest r
5、equestWithURL:url;定義ConnectionNSURLConnection *conn = NSURLConnection allocinitWithRequest:request delegate:self;啟動Connectionconn start;POST請求步驟(定義/啟動Connection部分省略)定義URLNSString *urlStr = ;定義RequestNSMutableURLRequest *request = NSMutableURLRequest requestWithURL:url;/ 等待服務(wù)器響應(yīng)的最長時(shí)間request setTimeou
6、tInterval:5.0;/ 設(shè)置請求方法,大小寫無關(guān)request setHTTPMethod:post;NSString *bodyString = NSString stringWithFormat:username=%&password=%,_userNameText.text,_passwordText.text;/ 生成請求體數(shù)據(jù)并編碼NSData *body = bodyString dataUsingEncoding:NSUTF8StringEncoding;/ 設(shè)置HTTP請求數(shù)據(jù)體request setHTTPBody:body;GET & POST請求演練準(zhǔn)備項(xiàng)目介紹G
7、ET請求操作代碼/ 定義URLNSString *urlStr = NSString stringWithFormat:%?username=%&password=%, LOGIN_URL, _userNameText.text, _passwordText.text;/ 注意:網(wǎng)絡(luò)請求的URL,需要編碼才可以使用!NSURL *url = NSURL URLWithString:urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding;/ 定義請求NSURLRequest *request = NSURLReq
8、uest requestWithURL:url;/ 定義連接NSURLConnection *conn = NSURLConnection allocinitWithRequest:request delegate:self;/ 開始訪問conn start;獲得服務(wù)器數(shù)據(jù)的準(zhǔn)備工作interface ViewController : UIViewController interface ViewController () / 接收返回?cái)?shù)據(jù)方法會被調(diào)用多次,需要定義成員變量記錄接收到的數(shù)據(jù) NSMutableData *_receivedData;- (IBAction)getLogin:(i
9、d)sender / 初始化接收數(shù)據(jù) _receivedData = NSMutableData data; 通過NSURLConnectionDataDelegate代理方法接收數(shù)據(jù)/ 收到服務(wù)器返回?cái)?shù)據(jù),本方法會被調(diào)用多次- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data NSLog(收到服務(wù)器返回?cái)?shù)據(jù)%, data); _receivedData appendData:data;/ 數(shù)據(jù)接收結(jié)束- (void)connectionDidFinishLoading:(NSURLConn
10、ection *)connection NSString *string = NSString allocinitWithData:_receivedData encoding:NSUTF8StringEncoding; NSLog(接收完畢,返回內(nèi)容為:%, string); / 釋放數(shù)據(jù) _receivedData = nil;/ 網(wǎng)絡(luò)連接錯(cuò)誤- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error / 取消對URL的編碼即可發(fā)生錯(cuò)誤。 NSLog(網(wǎng)絡(luò)連接錯(cuò)誤:%, error.l
11、ocalizedDescription);POST請求操作代碼/ 初始化接收數(shù)據(jù)_receivedData = NSMutableData data;/ 定義URL,字母及數(shù)字組成的url不需要編碼NSURL *url = NSURL URLWithString:LOGIN_URL;/ 定義請求NSMutableURLRequest *request = NSMutableURLRequest requestWithURL:url;/ 等待服務(wù)器響應(yīng)的最長時(shí)間request setTimeoutInterval:5.0;/ 設(shè)置請求方法,大小寫無關(guān)request setHTTPMethod:p
12、ost;NSString *bodyString = NSString stringWithFormat:”username=%&password=%, _userNameText.text, _passwordText.text;/ 生成請求體數(shù)據(jù)并編碼NSData *body = bodyString dataUsingEncoding:NSUTF8StringEncoding;/ 設(shè)置HTTP請求數(shù)據(jù)體,NSMutableURLRequest會自動在請求頭中加入Content-Lengthrequest setHTTPBody:body;/ 定義連接NSURLConnectionData
13、Delegate代理方法/ 發(fā)送數(shù)據(jù)給服務(wù)器,POST請求使用此方法- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite NSLog(“發(fā)送數(shù)據(jù)給服務(wù)器 bytesWritten: %d, totalBytesWritten %d totalBytesEx
14、pectedToWrite %d”, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);其他方法無需做任何更改!本節(jié)知識點(diǎn)回顧Get & Post請求網(wǎng)絡(luò)訪問的四個(gè)步驟地址請求連接處理結(jié)果iOS網(wǎng)絡(luò)處理常用類NSURL(地址)NSRequestGET & NSMutableURLRequestPOST(請求)NSConnection(連接)實(shí)現(xiàn)NSURLConnectionDataDelegate代理方法可以接收服務(wù)器響應(yīng)數(shù)據(jù)(處理結(jié)果)NSURLConnectionDataDelegate數(shù)據(jù)代理方法回顧開始接收接收數(shù)據(jù)完
15、成接收出現(xiàn)錯(cuò)誤如果是POST請求,發(fā)送數(shù)據(jù)關(guān)于代理方法代理方法存在的問題代理方法較多,比較分散要處理一個(gè)請求,需要在很多地方編寫代碼不利于邏輯實(shí)現(xiàn)、代碼編寫、調(diào)試、維護(hù)以及擴(kuò)展尤其當(dāng)存在多個(gè)請求時(shí)會變得非常麻煩!已經(jīng)學(xué)習(xí)過的代理方法UIApplicationDelegateUITableViewDelegate、UITableViewDataSourceUITextFieldDelegate通過協(xié)議自定義代理方法NSURLConnectionDataDelegate同步請求和異步請求NSURLConnection提供了兩個(gè)靜態(tài)方法可以直接同步或異步調(diào)用NSURLRequest,而無需通過NSU
16、RLConnectionDataDelegate獲取數(shù)據(jù)同步請求:sendSynchronousRequest:request returningResponse:&response error:&error異步請求:sendAsynchronousRequest:request queue:NSOperationQueue mainQueue completionHandler:(NSURLResponse *response, NSData *data, NSError *error)有關(guān)主操作隊(duì)列的內(nèi)容,在多線程課程講解同步和異步請求演練界面調(diào)整,增加同步和異步按鈕同步請求演練重構(gòu)Pos
17、t請求方法重構(gòu)后的方法/ 生成POST請求- (NSMutableURLRequest *)postLoginRequest / 定義URL,字母及數(shù)字組成的url不需要編碼 NSURL *url = NSURL URLWithString:LOGIN_URL; / 定義請求 NSMutableURLRequest *request = NSMutableURLRequest requestWithURL:url; / 等待服務(wù)器響應(yīng)的最長時(shí)間 request setTimeoutInterval:5.0; / 設(shè)置請求方法,大小寫無關(guān) request setHTTPMethod:post;
18、NSString *bodyString = NSString stringWithFormat:username=%&password=%, _userNameText.text, _passwordText.text; / 生成請求體數(shù)據(jù)并編碼 NSData *body = bodyString dataUsingEncoding:NSUTF8StringEncoding; / 設(shè)置HTTP請求數(shù)據(jù)體,NSMutableURLRequest會自動在請求頭中加入Content-Length request setHTTPBody:body; return request;同步請求用戶登錄-
19、(IBAction)syncLogin:(id)sender NSMutableURLRequest *request = self postLoginRequest; NSError *error; NSURLResponse *response; NSData *data = NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error; / 注意,只有同步請求結(jié)束之后,才會執(zhí)行后續(xù)操作,修改LOGIN_URL可以看到效果 if (!data) NSLog(同步訪問錯(cuò)誤:%,
20、error.localizedDescription); else / 解碼數(shù)據(jù) NSString *string = NSString allocinitWithData:data encoding:NSUTF8StringEncoding; NSLog(同步返回內(nèi)容:%, string); 異步請求用戶登錄NSMutableURLRequest *request = self postLoginRequest;/ 注意此處使用了塊代碼!異步請求隊(duì)列使用的是操作隊(duì)列的主隊(duì)列NSURLConnection sendAsynchronousRequest:request queue:NSOper
21、ationQueue mainQueue completionHandler:(NSURLResponse *response, NSData *data, NSError *error) if (data length 0 & error = nil) / 解碼數(shù)據(jù) NSString *string = NSString allocinitWithData:data encoding:NSUTF8StringEncoding; NSLog(異步返回內(nèi)容:%, string); else if (data length = 0 & error = nil) NSLog(沒有接收到返回?cái)?shù)據(jù)); else NSLog(異步訪問錯(cuò)誤:%, error.localizedDescription); ;緩存策略NSURLRequest的cachePolicy屬性可以設(shè)置緩存策略,這是一種內(nèi)存緩存,非硬盤緩存使用緩存的目的是為了使用的應(yīng)用程序能更快速的響應(yīng)用戶輸入,使程序高效的運(yùn)行。有時(shí)候我
評論
0/150
提交評論