想要在 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 範例如下:
- NSString *url = @"https://tw.yahoo.com/";
- NSMutableURLRequest *requestClient = [NSMutableURLRequest
- requestWithURL:[NSURL URLWithString:url]
- cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
- timeoutInterval:10
- ];
- [requestClient setHTTPMethod: @"GET"];
- NSError *requestError;
- NSURLResponse *urlResponse = nil;
- //Make a request
- NSData *response = [NSURLConnection
- sendSynchronousRequest: requestClient
- returningResponse: &urlResponse
- error: &requestError
- ];
- NSString *responseData = [[NSString alloc]initWithData: response
- encoding: NSUTF8StringEncoding
- ];
- NSLog(@"response = %@", responseData);
異步 Request
異步 Request 與 同步 Request 的差別就在於一個是會讓程式整個停止,等待網路回應成功 ,而異步 Request 則不會卡住程式的運行。
想使用異步 Request , 要使用 NSURLConnection 的 sendAsynchronousRequest Method ,並且要宣告一個 Callback Function completionHandler。
範例如下:
- NSString *url = @"https://tw.yahoo.com/";
- NSMutableURLRequest *requestClient = [NSMutableURLRequest
- requestWithURL:[NSURL URLWithString:url]
- cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
- timeoutInterval:10
- ];
- [requestClient setHTTPMethod: @"GET"];
- NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init];
- [NSURLConnection sendAsynchronousRequest: requestClient
- queue:backgroundQueue
- completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
- NSString *responseData = [[NSString alloc]initWithData: data
- encoding: NSUTF8StringEncoding
- ];
- NSLog(@"Response = %@", responseData);
- }
- ];
- NSLog(@"running");
上述的範例,執行後,螢幕會先印出 running ,然後等 Request 成功後,會再印出 tw.yahoo.com 的頁面內容。
回應 (Leave a comment)