我是AFNetworking,
您可以透過我提供的AFHTTPSessionManager, 進行RESTful SOA的存取。 |
延續RESTful SOA的議題,我們將透過AFNetworking中的AFHTTPSessionManager進行RESTful SOA的C(create方法),以建立使用者User。
1. 建立專案
2. 設計畫面
3. 加入AFNetworking套件
4. POST方法,建立用戶user
5. 測試
同樣的,AFHTTPSessionManager提供對應於HTTP Method的GET、PUT與DELETE,讓您可以對應到RESTful SOA的URD(Update、Read、Delete),AFHTTPSessionManager類別的參考連結如下:1. 建立專案
- 建立名為afnetworing_RESTful_SOA的Single View專案
2. 設計畫面
- 在預設的場景畫面中加上:
- 3個Label:顯示的文字為姓名、年齡和性別
- 2個TextField:連結IBOutlet為nameTextField與ageTextField
- 1個SegmentedControl:連結IBOutlet為genderSegmentedControl
- 1個Button:顯示的文字建立,連結IBAction為create,對應的事件為touchInside
3. 加入AFNetworking套件
- 至https://github.com/AFNetworking/AFNetworking,按下右下方的"Download ZIP"按鈕,下載AFNetworking-master.zip
- 解開AFNetworking-master.zip後,找到AFNetworking資料匣,托拉至您的專案中,勾選"copy items..."copyAFNetworking至專案中
4. POST方法,建立用戶user
- 於create方法中透過AFHTTPSessionManager物件呼叫RESTful SOA,而建立用戶user的HTTP Method是POST,因此可使用AFHTTPSessionManager物件的POST方法,將建立用戶user所需的資料傳送出去,以建立用戶user,完整的程式如下:
- (IBAction)create:(id)sender {
//以NSURL表示RESTful SOA主機的位置
NSURL *host = [[NSURL alloc] initWithString:@"http://localhost:3000"];
//建立AFHTTPSessionManager物件,
//並以RESTful SOA主機的位置作為存取的基礎位置。
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL: host];
//透過NSMutableDictionary物件,
//使用者從畫面輸入的資料。
NSMutableDictionary *data = [[NSMutableDictionary alloc] init];
[data setValue:self.nameTextField.text forKey:@"name"];
[data setValue:self.ageTextField.text forKey:@"age"];
[data setValue:(self.genderSegmentedControl.selectedSegmentIndex == 0 ? @"1" : @"0") forKey:@"gender"];
//記得,RESTful SOA建立資料是使用POST HTTP Method,
//因此使用AFHTTPSessionManager物件的POST方法,
//將建立用戶User的資料送出,
//而parameters參數即代入存放資料的NSMutableDictionary物件。
[manager POST:@"users"
parameters:data
//呼叫成功,則呼叫success參數後的block,
//以進行後續的處理。
success:^(NSURLSessionDataTask *task, id responseObject) {
NSDictionary *result = responseObject;
//1. 檢查是否有error,
// 此error為成功存取RESTful SOA後的自訂error,
// 如先前定義的姓名不可為空白、至少4個字元等等。
if([result objectForKey:@"error"])
{
//取得錯誤代碼與訊息,
//透過UIAlertView顯示。
NSString *code =[[result objectForKey:@"error"] objectForKey:@"code"];
NSString *message =[[result objectForKey:@"error"] objectForKey:@"message"];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:code
message:message
delegate:nil
cancelButtonTitle:@"ok"
otherButtonTitles:nil];
[alert show];
}
else
{
//透過UIAlertView顯示建立成功訊息
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
message:@"成功建立!"
delegate:nil
cancelButtonTitle:@"ok"
otherButtonTitles:nil];
[alert show];
}
}
//failure為無法正常存取RESTful SOA,
//如:網路問題、存取資源的路徑不正確皆可能產生此問題等等。
//若失敗,則呼叫failure參數後的block,
//以進行後續的處理。
failure:^(NSURLSessionDataTask *task, NSError *error) {
//透過UIAlertView顯示呼叫錯誤的原因資訊
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:[error description]
delegate:nil
cancelButtonTitle:@"ok"
otherButtonTitles:nil];
[alert show];
}];
}
- 啟動RESTful SOA伺服器
- 在此我們使用先前透過rails建立的RESTful SOA服務 - user_service_2_activerecord_full.zip
- 下載後開啟終端機,切換到{user}\user_service_2目錄
- 輸入rails server,透過rails server啟動伺服器
- 測試1:
- 姓名:KH
- 年齡:31
- 性別:男性
- 預期結果:驗證錯誤 => code:0002 message:at least chars for name.
http://cocoadocs.org/docsets/AFNetworking/2.0.0/Classes/AFHTTPSessionManager.html
完整的AFNetworking參考連結:
http://cocoadocs.org/docsets/AFNetworking/2.0.0/index.html
注意事項:
- 若您使用的iOS為6.1之前的版本,請以AFHTTPRequestOperationManager代替AFHTTPSessionManager。