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)