2014
Mar
16

想要在 IOS 中取得某個 URL 的內容,或是使用像 PHP 中 CURL 的功能,在 IOS 裡有個物件叫 NSURLConnection , NSURLConnection 提供了簡單的 interface,讓我們能夠建立或取消一個網路連線, 也支援 delegate 的方式異步處理回應,另外還支援了 cache 管理機制,權限驗證,cookie 等等。

簡易的 Reuqest

一個 Request ,最簡單的物件,就是要宣告一個 client 的物件,在 IOS 中, client 物件就是 NSMutableURLRequest,然後指定一個 URL 就能取得目標的內容,這裡我宣告了以下兩個變數,Url 設定成 Yahoo! 首頁。

  • 宣告 Url : NSString *url = @"https://tw.yahoo.com";
  • 宣告 Client : NSMutableURLRequest *requestClient

要將上述的 requestClient 傳送 Request 的方式,是使用 NSURLConnection 這個 IOS 內建的物件,這裡我設定參數 sendSynchronousRequest ,代表我要使用「系統同步」的方式取得網頁內容,「系統同步」是最簡單的 Request 方式,它會使程式依序執行,比較容易管理。

NSURLConnection 執行成功後,會回傳一個 NSData 的資料格式,這個格式並非為純文字,沒辦法直接使用他,所以我們要再將 NSData 轉成 NSString 格式,並且要指定編碼方式 encoding: NSUTF8StringEncoding

Curl or Request 範例如下:

Curl In IOS
  1. NSString *url = @"https://tw.yahoo.com/";
  2. NSMutableURLRequest *requestClient = [NSMutableURLRequest
  3. requestWithURL:[NSURL URLWithString:url]
  4. cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
  5. timeoutInterval:10
  6. ];
  7.  
  8. [requestClient setHTTPMethod: @"GET"];
  9. NSError *requestError;
  10. NSURLResponse *urlResponse = nil;
  11.  
  12. //Make a request
  13. NSData *response = [NSURLConnection
  14. sendSynchronousRequest: requestClient
  15. returningResponse: &urlResponse
  16. error: &requestError
  17. ];
  18.  
  19. NSString *responseData = [[NSString alloc]initWithData: response
  20. encoding: NSUTF8StringEncoding
  21. ];
  22.  
  23. NSLog(@"response = %@", responseData);
  24.  

異步 Request

異步 Request 與 同步 Request 的差別就在於一個是會讓程式整個停止,等待網路回應成功 ,而異步 Request 則不會卡住程式的運行。

想使用異步 Request , 要使用 NSURLConnection 的 sendAsynchronousRequest Method ,並且要宣告一個 Callback Function completionHandler

範例如下:

Asynchronous curl In IOS
  1. NSString *url = @"https://tw.yahoo.com/";
  2. NSMutableURLRequest *requestClient = [NSMutableURLRequest
  3. requestWithURL:[NSURL URLWithString:url]
  4. cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
  5. timeoutInterval:10
  6. ];
  7. [requestClient setHTTPMethod: @"GET"];
  8.  
  9. NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init];
  10. [NSURLConnection sendAsynchronousRequest: requestClient
  11. queue:backgroundQueue
  12. completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
  13. NSString *responseData = [[NSString alloc]initWithData: data
  14. encoding: NSUTF8StringEncoding
  15. ];
  16. NSLog(@"Response = %@", responseData);
  17. }
  18. ];
  19. NSLog(@"running");

上述的範例,執行後,螢幕會先印出 running ,然後等 Request 成功後,會再印出 tw.yahoo.com 的頁面內容。


回應 (Leave a comment)