iOS网络编程同步GET方法请求编程

时间:2024-11-10 16:35:14

iOS SDK为HTTP请求提供了同步和异步请求两种不同的API,而且可以使用GET或POST等请求方法。我们先了解其中最为简单的同步GET方法请求。

首先实现查询业务,查询业务请求可以在主视图控制器MasterViewController类中实现,其中MasterViewController.h代码如下:

  1. #import <UIKit/UIKit.h>
  2. #import “NSString+URLEncoding.h”
  3. #import “NSNumber+Message.h”
  4. @interface MasterViewController : UITableViewController
  5. @property (strong, nonatomic) DetailViewController *detailViewController;
  6. //保存数据列表
  7. @property (nonatomic,strong) NSMutableArray* listData;
  8. //重新加载表视图
  9. -(void)reloadView:(NSDictionary*)res;
  10. //开始请求Web Service
  11. -(void)startRequest;
  12. @end

其中引入头文件NSString+URLEncoding.h文件是在程序中需要对URL进行编码处理。引入头文件 NSNumber+Message.h文件是处理把服务器返回消息代码转换为用户能看懂的消息。

  1. MasterViewController.m中的主要代 码如下:
  2. - (void)viewDidLoad
  3. {
  4. [super viewDidLoad];
  5. self.navigationItem.leftBarButtonItem = self.editButtonItem;
  6. self.detailViewController  = (DetailViewController *)
  7. [[self.splitViewController.viewControllers lastObject] topViewController];
  8. [self startRequest];                                                ①
  9. }
  10. #pragma mark – Table View
  11. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  12. return 1;
  13. }
  14. - (NSInteger)tableView:(UITableView *)tableView
  15. numberOfRowsInSection:(NSInteger)section {
  16. return self.listData.count;
  17. }
  18. - (UITableViewCell *)tableView:(UITableView *)tableView
  19. cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  20. UITableViewCell *cell
  21. = [tableView dequeueReusableCellWithIdentifier:@"Cell"
  22. forIndexPath:indexPath];
  23. NSMutableDictionary*  dict = self.listData[indexPath.row];
  24. cell.textLabel.text = [dict objectForKey:@"Content"];
  25. cell.detailTextLabel.text = [dict objectForKey:@"CDate"];
  26. return cell;
  27. }

其中第①行代码[self startRequest]调用自己的方法startRequest实现请求Web Service。MasterViewController.m中的startRequest方法代码如下:

  1. /*
  2. * 开始请求Web Service
  3. */
  4. -(void)startRequest
  5. {
  6. NSString *strURL = [[NSString alloc] initWithFormat:
  7. @”http://iosbook3/mynotes/webservice.php?email=%@&type=%@&action=%@”,
  8. @”<你的iosbook1.com用户邮箱>”,@”JSON”,@”query”];                           ①
  9. NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]];             ②
  10. NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];               ③
  11. NSData *data  = [NSURLConnection sendSynchronousRequest:request
  12. returningResponse:nil error:nil];                       ④
  13. NSLog(@”请求完成…”);
  14. NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data
  15. options:NSJSONReadingAllowFragments error:nil];
  16. [self reloadView:resDict];                                              ⑤
  17. }

此外,我们在前文中还提到了一个分类NSString (URLEncoding),它的作用是对URL编码和解码,它的代码如下:

  1. @interface NSString (URLEncoding)
  2. -(NSString *)URLEncodedString;
  3. -(NSString *)URLDecodedString;
  4. @end
  5. @implementation NSString (URLEncoding)
  6. - (NSString *)URLEncodedString
  7. {
  8. NSString *result = (NSString *)
  9. CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,①
  10. (CFStringRef)self,
  11. NULL,                           ②
  12. CFSTR(“+$,#[] “),                      ③
  13. kCFStringEncodingUTF8));
  14. return result;
  15. }
  16. - (NSString*)URLDecodedString
  17. {
  18. NSString *result = (NSString *)
  19. CFBridgingRelease(CFURLCreateStringByReplacingPercentEscapesUsingEncoding
  20. (kCFAllocatorDefault,                                                 ③
  21. (CFStringRef)self, CFSTR(“”),                                       ④
  22. kCFStringEncodingUTF8));
  23. return result;
  24. }
  25. @end

第①行代码CFURLCreateStringByAddingPercentEscape函数是Core Foundation框架提供的C函数,可以把内容转换成为URL编码。第②行参数指定了将本身为非法URL字符不进行编码的字符集合,例如:“!* ()”等符号。第③行参数是将本身为合法URL字符需要进行编码的字符集合。

第③行代码CFURLCreateStringByReplacingPercentEscapesUsingEncoding函数是Core Foundation框架提供的C函数,它与上面CFURLCreateStringByAddingPercentEscape函数截然相反,是进行 URL解码的。第④行的参数指定不进行解码的字符集。

Foundation框架也提供了基于Objective-C的方法进行URL编码和解码,与 CFURLCreateStringByAddingPercentEscape函数对应的NSString方法是 stringByAddingPercentEscapesUsingEncoding。与 CFURLCreateStringByReplacingPercentEscapesUsingEncoding函数对应的NSString方法是 stringByReplacingPercentEscapesUsingEncoding:,由于这些方法不能自定义是否要编码和解码的字符集,因此 没有上面的函数灵活。