JSONによるWEBアプリとiPhoneアプリのAPI連携

RailsアプリケーションでJSONデータを返すAPIを実装し、iPhoneアプリから受信する方法をご紹介します。

環境
  • Rails 1.2.3
  • json 0.4.1 [gem]
  • iPhoneSDK 3.1.3
  • json-framework 2.2.3

iPhoneアプリ

json-framworkというフレームワークを使ってJSONを扱うことができます。

  • json-framework をiPhoneSDKに組み込む
    • dmgをダウンロード・解凍
      • 今回は ~/Library 下に置くことを前提とします。
    • プロジェクト設定
      • 「ビルド」=>「追加SDK」の値に以下を記述します。
$HOME/Library/SDKs/JSON/$(PLATFORM_NAME).sdk
      • 「ビルド」=>「他のリンカフラグ」の値に以下を記述します。
-ObjC -ljson -all_load
  • JSONデータの受けかた
    • SDKをインポート
#import "JSON/JSON.h"
    • 受け皿の実装
// JSONデータのリクエスト
NSURL *jsonURL = [NSURL URLWithString:@"http://0.0.0.0:3000/users/show/1.json"];
NSMutableString *jsonData = [NSMutableString stringWithContentsOfURL:jsonURL
							    encoding:NSUTF8StringEncoding
							       error:nil];

// シングルクォーテーションはJSONでは扱えないため、ダブルクォーテーションに変換
[jsonData replaceOccurrencesOfString:@"'"
		          withString:@"\""
			     options:NSCaseInsensitiveSearch
			       range:NSMakeRange(0,[jsonData length])];

// result にデータを受けて出力
if (jsonData != nil) {
    id result = [jsonData JSONValue];   // JSONValue が外部メソッド
    NSLog(@"%@", result);
}

Railsアプリケーション

  • アクション名.json のリクエストを受けられるようにする
# config/routes.rb
map.connect ':controller/:action.:format'
map.connect ':controller/:action/:id.:format'   # users/show/1 のようにパラメータをパスで扱っている場合
  • アクションからJSONデータを返す
  render :text => @object.to_json
  • データの形式を調整する
    • Rails組み込みの to_json メソッドと json gem の to_json メソッドでは、以下のように挙動が変わります。
$ ruby script/console 
Loading development environment.
>> data = {"id" => 1}
=> {"id"=>1}
>> data.to_json
=> "{id: 1}"   # 属性がダブルクォートされていない
>> require "json"
=> ["JSON"]
>> data.to_json
=> "{\"id\":1}"   # 属性がダブルクォートされている
    • json-framework では属性をダブルクォートした値を扱いたいので、json gem の to_json を使うようにします。
require "json"
 ・・・
render :text => @object.to_json