前回の続き。今回はAFHTTPClientクラスの説明です。サーバーの各種APIを叩きたい時がありますよね。

例えばAPIのURLが以下のようになっているとします。

  • https://api.example.com/1.1/favorites/list.json – お気に入りの取得
  • https://api.example.com/1.1/direct_messages.json – ダイレクトメッセージの取得
  • https://api.example.com/1.1/statuses/update.json – つぶやきの投稿

つまり、https://api.example.com/1.1/の部分はみな同じで、それ以下のパスが変わります。こういった場合、AFHTTPClientを使うと便利です。

AFHTTPClientを初期化

NSURL *apiURL = [NSURL URLWithString:@"https://api.example.com/1.1/"];
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:apiURL];
// AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:twitterAPIURL]; これでもよい

お気に入りの取得(GET)をしたい場合

[client getPath:@"favorites/list.json"
     parameters:@{ @"user_id" : user_id }
        success:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"success");
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             NSLog(@"fail");
        }];

このようにパスの部分だけ指定すれば良いので楽です。

つぶやきの投稿(POST)をしたい場合

[client postPath:@"statuses/update.json"
     parameters:@{ @"status" : status, @"user_id" : user_id }
        success:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"success");
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             NSLog(@"fail");
        }];

PUTやDELETEの場合

PUTやDELETEは以下のメソッドを使います。

  • putPath:parameters:success:failure
  • deletePath:parameters:success:failure

AFHTTPClientオブジェクトの扱い

これらの***Pathメソッドの内部でNSHTTPRequestOperationオブジェクトが作られ、AFHTTPClientが管理するNSOperationQueueにキューイングされます。なのでキュー管理も自分で行う必要はありません。

逆に言うとAFHTTPClientはViewControllerのメンバ変数、もしくはアプリケーション内でオブジェクトを保持しておく必要があります。また、アプリケーションでは、AFHTTPClientを直接使わずにSubclassにして使うほうが良いと思います。getPath,postPathメソッドも直接使わないようにして、getFavorites,updateStatusといったメソッドに隠蔽して、それらを使うようにすると保守性が高くなります。

1つのアプリケーションで複数のウェブサービスのAPIへアクセスする必要がある場合は、それごとにAFHTTPClientのSubclassを作るとよさそうです。

NSHTTPRequestOperationオブジェクトを作る場合

NSHTTPRequestOperationおよびそのSubclass(AFJSONRequestOperation)をキューに入れたい場合は、以下のようにします。

NSURLRequest *request = [NSURLRequest requestWithURL:〜〜〜];
// もしくは、NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:〜〜〜];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[client enqueueHTTPRequestOperation:operation];

NSHTTPRequestOperationのSubclassである独自のOperationクラスを使いたい場合は、役に立つと思います。

キャンセル

すべてのリクエストをキャンセルしたい場合は以下のようにします。

[client.operationQueue cancelAllOperations];

特定のHTTPメソッドまたはパスが一致するリクエストをキャンセルしたい場合は以下のようにします。

// GETメソッドかつfavorites/listの場合
[client cancelAllHTTPOperationsWithMethod:@"GET"
                                     path:@"favorites/list"];
// HTTPメソッドを問わない場合
[client cancelAllHTTPOperationsWithMethod:nil
                                     path:@"favorites/list"];

以上、AFHTTPClientの説明でした。