iOS SDK為HTTP請求提供了同步和非同步請求兩種不同的API,而且可以使用GET或POST等要求方法。我們先瞭解其中最為簡單的同步GET方法請求。
為了學習這些API的使用MyNotes“備忘錄”應用執行個體,是資料來源於伺服器端,而不是本地的Notes.xml(或Notes.json)檔案。
首先實現查詢業務,查詢業務請求可以在主視圖控制器MasterViewController類中實現,其中MasterViewController.h代碼如下:
#import <UIKit/UIKit.h>#import “NSString+URLEncoding.h”#import “NSNumber+Message.h” @interface MasterViewController : UITableViewController @property (strong, nonatomic) DetailViewController *detailViewController;//儲存資料列表@property (nonatomic,strong) NSMutableArray* listData; //重新載入表視圖-(void)reloadView:(NSDictionary*)res; //開始請求Web Service-(void)startRequest; @end
其中引入標頭檔NSString+URLEncoding.h檔案是在程式中需要對URL進行編碼處理。引入標頭檔 NSNumber+Message.h檔案是處理把伺服器返回訊息代碼轉換為使用者能看懂的訊息。MasterViewController.m中的主要代 碼如下:
- (void)viewDidLoad{[super viewDidLoad];self.navigationItem.leftBarButtonItem = self.editButtonItem;self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];[self startRequest]; ①} #pragma mark – Table View- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {return 1;} - (NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section {return self.listData.count;} - (UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath {UITableViewCell *cell= [tableView dequeueReusableCellWithIdentifier:@"Cell"forIndexPath:indexPath];NSMutableDictionary* dict = self.listData[indexPath.row];cell.textLabel.text = [dict objectForKey:@"Content"];cell.detailTextLabel.text = [dict objectForKey:@"CDate"];return cell;}
其中第①行代碼[self startRequest]調用自己的方法startRequest實現請求Web Service。MasterViewController.m中的startRequest方法代碼如下:
/** 開始請求Web Service*/-(void)startRequest{NSString *strURL = [[NSString alloc] initWithFormat:@”http://iosbook3/mynotes/webservice.php?email=%@&type=%@&action=%@”,@”<你的iosbook1.com使用者郵箱>”,@”JSON”,@”query”]; ①NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]]; ②NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; ③NSData *data = [NSURLConnection sendSynchronousRequest:requestreturningResponse:nil error:nil]; ④NSLog(@”請求完成…”);NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:dataoptions:NSJSONReadingAllowFragments error:nil];[self reloadView:resDict]; ⑤}
此外,我們在前文中還提到了一個分類NSString (URLEncoding),它的作用是對URL編碼和解碼,它的代碼如下:
@interface NSString (URLEncoding) -(NSString *)URLEncodedString;-(NSString *)URLDecodedString; @end @implementation NSString (URLEncoding) - (NSString *)URLEncodedString{NSString *result = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,①(CFStringRef)self,NULL, ②CFSTR(“+$,#[] “), ③kCFStringEncodingUTF8));return result;}- (NSString*)URLDecodedString{NSString *result = (NSString *)CFBridgingRelease(CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, ③(CFStringRef)self, CFSTR(“”), ④kCFStringEncodingUTF8));return result;}@end
第①行代碼CFURLCreateStringByAddingPercentEscape函數是Core Foundation架構提供的C函數,可以把內容轉換成為URL編碼。第②行參數指定了將本身為非法URL字元不進行編碼的字元集合,例如:“!* ()”等符號。第③行參數是將本身為合法URL字元需要進行編碼的字元集合。
第③行代碼CFURLCreateStringByReplacingPercentEscapesUsingEncoding函數是Core Foundation架構提供的C函數,它與上面CFURLCreateStringByAddingPercentEscape函數截然相反,是進行 URL解碼的。第④行的參數指定不進行解碼的字元集。
Foundation架構也提供了基於Objective-C的方法進行URL編碼和解碼,與 CFURLCreateStringByAddingPercentEscape函數對應的NSString方法是 stringByAddingPercentEscapesUsingEncoding。與 CFURLCreateStringByReplacingPercentEscapesUsingEncoding函數對應的NSString方法是 stringByReplacingPercentEscapesUsingEncoding:,由於這些方法不能自訂是否要編碼和解碼的字元集,因此 沒有上面的函數靈活。