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 }