「ちょっとこの Web API 使ってなんかつくってみるか」ということがたまにある(とくにハッカソンで)ので、手早くつくれるように僕なりの手順をまとめてみました。
「共通処理の実装」までは簡単な文字列の置換で済むので、 ファイルテンプレートにしておく とより簡単になりそうです(参考:Xcodeのファイルテンプレートを自作する)。
##1. 共通処理の実装
APIキーをセットするメソッドの定義と実装と、オブジェクト初期化用のメソッド実装。
###ヘッダ
+ (void)setAPIKey:(NSString *)APIKey;
###実装ファイル
#import "AFJSONRequestOperation.h"
#define API_BASE_URL @"http://xxxx"
@interface XXXX ()
@property (nonatomic) NSString *APIKey;
@end
+ (XXXX *)sharedClient
{
static XXXX *sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedClient = [[XXXX alloc] initWithBaseURL:[NSURL URLWithString:API_BASE_URL]];
});
return sharedClient;
}
- (id)initWithBaseURL:(NSURL *)url
{
if (self = [super initWithBaseURL:url]) {
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];
[self setParameterEncoding:AFJSONParameterEncoding];
[self setDefaultHeader:@"Accept" value:@"application/json"];
}
return self;
}
+ (void)setAPIKey:(NSString *)APIKey {
[[XXXX sharedClient] setAPIKey:APIKey];
}
##2. 汎用Privateメソッドの実装
ここは各サービスの仕様に合わせて実装を変える必要がある。APIキーをセットする、とか、そのサービスにおけるAPIをたたく際の共通の処理をここで行う。
(APIキーをパラメータに渡す場合)
- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
path:(NSString *)path
parameters:(NSDictionary *)parameters
{
NSAssert(self.APIKey, @"API Key has not been set.\n\n");
path = [path stringByAppendingFormat:@"?api_key=%@", self.APIKey];
for (NSString *key in [parameters keyEnumerator]) {
NSString *value = [NSString stringWithFormat:@"%@",
[parameters valueForKey:key]];
NSAssert2([key length] && [value length],
@"invalid param! key:%@: value:%@", key, value);
path = [path stringByAppendingFormat:@"&%@=%@", key, value];
}
NSMutableURLRequest *req = [super requestWithMethod:method
path:path
parameters:nil];
return req;
}
##3. 各APIに対応したメソッドを書く
- (void)companyWithName:(NSString *)name
handler:(void (^)(NSDictionary *result, NSError *error))handler
{
NSAssert([name length], @"name is required");
__weak XXXX *weakSelf = self;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSString *path = [NSString stringWithFormat:@"company/%@.js", name];
[weakSelf getPath:path
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
dispatch_async(dispatch_get_main_queue(), ^{
handler(responseObject, nil);
});
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
handler(nil, error);
});
}];
});
}
##サンプル
この手順でつくったAPIクライアント
-
CrunchBase API Client for iOS
- 米国のテック系企業の情報が詰まったデータベース『CrunchBase』のAPIクライアント
- 記事:CrunchBase APIをiOSアプリで使用する手順のメモ、およびAPIクライアントつくりました
-
Klout API Client for iOS
- Klout スコアを取得するAPIクライアント
- 記事:Kloutスコアを取得するライブラリをつくりました