2013-網(wǎng)絡(luò)傳輸1101.基礎(chǔ)_第1頁
2013-網(wǎng)絡(luò)傳輸1101.基礎(chǔ)_第2頁
2013-網(wǎng)絡(luò)傳輸1101.基礎(chǔ)_第3頁
2013-網(wǎng)絡(luò)傳輸1101.基礎(chǔ)_第4頁
2013-網(wǎng)絡(luò)傳輸1101.基礎(chǔ)_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余27頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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í)候我

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論