hagino3000's blog

平成アーカイブス (更新停止)

CocoaでJSON-RPC

使った物

SBJson
http://stig.github.com/json-framework/
ASIHTTPRequest
http://allseeing-i.com/ASIHTTPRequest/

どちらもsocket.io-objcが依存しているため既に使っていた。ここでやりたいのは、リクエストボディはJSON文字列のみでPOST、レスポンスもJSON文字列のみという方式。

// 送信データの準備
NSMutableDictionary *dataDict = [[NSMutableDictionary alloc] init];
[dataDict setValue:@"hagino3000" forKey:@"name"];
[dataDict setValue:@"JavaScriipt" forKey:@"lang"];

// NSMutableDictionary -> JSON文字列 -> NSData に変換
NSString *dataStr = [dataDict JSONRepresentation];
NSLog(@"Request body: %@", dataStr);
NSData *postBody = [dataStr dataUsingEncoding:NSUTF8StringEncoding];

// HTTPリクエストの準備
NSURL *url = [NSURL URLWithString:@"http://dev.hagino3000.com/t"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setRequestMethod:@"POST"];
[request setRequestHeaders:[NSMutableDictionary dictionaryWithObjectsAndKeys:
                            @"application/json", @"Content-Type"
                            , nil]];
[request setPostBody: [NSMutableData dataWithData:postBody]];

// 同期通信で送信
[request startSynchronous];

NSError *error = [request error];
if (error) {
    // Connection Error
}

// レスポンスの確認
NSString *response = [request responseString];
NSLog(@"Response: %@", response);

// JSON文字列をNSDictionaryに変換
SBJsonParser *parser = [[SBJsonParser alloc] init];
NSDictionary *result = [parser objectWithString:response error:&error];

if (error) {
    // Parse error
}