iOSで自作WebAPIにアクセスする
社内業務システムのWebAPI実装を考えてみる - おかひろの雑記で作成したような自作WebAPIに、Objective-Cからアクセスするプログラムを作成してみました。
レスポンスはJSONのみ対応とします。
Objective-CからのHTTP接続についてはこの本でもちょこっと紹介されていますが、
エキスパートObjective-Cプログラミング ?iOS/OS Xのメモリ管理とマルチスレッド?
- 作者: 坂本一樹
- 出版社/メーカー: インプレス
- 発売日: 2011/11/18
- メディア: 単行本(ソフトカバー)
- 購入: 8人 クリック: 343回
- この商品を含むブログ (25件) を見る
"AsyncURLConnection"で検索するとそれっぽいライブラリがいくつかヒットしますが、今回はこれを使ってみました。
ASyncURLConnection.h · GitHub
ASyncURLConnection.m · GitHub
使い方の例
[SVProgressHUD show]; NSString *url = [NSString stringWithFormat:@"http://sample.example.com/webapi/test"]; NSLog(@"%@",url); [AsyncURLConnection request:url completeBlock:^(NSData *data){ NSError *jsonError = nil; self.dataArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&jsonError]; if(!dataArray) { NSLog(@"Error : %@",jsonError); UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"エラー" message:@"JSONエラー" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; [SVProgressHUD dismiss]; return ; } dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ dispatch_async(dispatch_get_main_queue(),^{ // 処理 ... [SVProgressHUD dismiss]; }); }); } errorBlock:^(NSError *error){ UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"エラー" message:@"ネットワークエラー" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; [SVProgressHUD dismiss]; }];
SVProgressHUDを使って、通信中であることがわかりやすいようにしています。
GitHub - SVProgressHUD/SVProgressHUD: A clean and lightweight progress HUD for your iOS and tvOS app.
errorBlockでエラーハンドリングができるようになっていますが、これはNSURLConnectionクラスのdidFailWithErrorから呼ばれているので、ネットワークが繋がっていないなどのエラーはとれますが、404などのステータスコードが返ってきた場合はerrorBlockではとれません。
レスポンスのステータスコードを確認したい場合やリクエストでPOSTを使いたい場合は、少しいじる必要がありそうです。
jQueryの$.ajaxみたいに使えるライブラリがあるといいですね・・・。時間があるときに探してみたいと思います。