iOSで自作WebAPIにアクセスする

社内業務システムのWebAPI実装を考えてみる - おかひろの雑記で作成したような自作WebAPIに、Objective-Cからアクセスするプログラムを作成してみました。
レスポンスはJSONのみ対応とします。


Objective-CからのHTTP接続についてはこの本でもちょこっと紹介されていますが、

エキスパートObjective-Cプログラミング ?iOS/OS Xのメモリ管理とマルチスレッド?

エキスパートObjective-Cプログラミング ?iOS/OS Xのメモリ管理とマルチスレッド?

レスポンスをBlocksで処理できるようになっていると便利そうです。

"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みたいに使えるライブラリがあるといいですね・・・。時間があるときに探してみたいと思います。