WebAPIに一回だけアクセスして、2回目以降はローカルモックで開発する方法

2016.07.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

WebAPIにアクセスするアプリを作成する場合、本番用サーバだけで開発を行うのは、条件的に難しい場合があります。また、デバッグ用に、受信データを自由に変更したい場合もあります。

今回は、天気予報データをWebAPIで取得するアプリを例にとって、1度だけサーバにアクセスしてデータを取得し、2回目以降はローカルのモックサーバで開発を進める手順を紹介します。

天気予報のデータは、無料でも利用可能なOpenWeatherMapを使用しました。

006

こちらのサービスは、APIキーを取得することで無料でも利用が可能ですが、無料枠では、 「1つのデバイスからのリクエストは10分に1回に抑える」「リクエスに失敗したら10分間は再リクエストを控える」などの制限が設けられています。 http://openweathermap.org/appid#get

このような場合、サーバへのアクセスを頻繁に行って開発を進めることは、避けなければなりません。それでは、早々にモックサーバーを準備してみましょう。

2 天気情報の取得

まず、最初に、WebAPIからデータを取得するために下記のコードを作成しました。

NSString *API_KEY = @"26axxxxxxxxxxxxxxxxxxxxxxxxxcca2";
NSString *hostname = @"api.openweathermap.org";
NSString *url = [NSString stringWithFormat:@"http://%@/data/2.5/weather?q=Tokyo,jp&units=metric&APPID=%@", hostname, API_KEY];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:url
  parameters:nil
    progress:nil
     success:^(NSURLSessionTask *task, id responseObject) {
         NSData *data = [NSJSONSerialization dataWithJSONObject:responseObject options:2 error:nil];
         NSString *json = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
         NSLog(@"json string: %@", json);
     } failure:^(NSURLSessionTask *operation, NSError *error) {
         NSLog(@"ERROR");
     }
];

上記では、取得したJSONデータを文字列にデコードしてログに出力しています。 これを実行すると、図のように取得したデータがログに出力されます。

001

ログに出力された文字列は、整形すると次のようになっています。
JSON整形

{
  "base": "stations",
  "id": 1850147,
  "dt": 1468400024,
  "main": {
    "humidity": 94,
    "temp_max": 28.89,
    "temp_min": 25,
    "temp": 26.65,
    "pressure": 999
  },
  "coord": {
    "lon": 139.69,
    "lat": 35.69
  },
  "wind": {
    "speed": 2.1,
    "deg": 130
  },
  "sys": {
    "id": 7619,
    "message": 0.0151,
    "country": "JP",
    "type": 1,
    "sunset": 1468403883,
    "sunrise": 1468352145
  },
  "weather": [
    {
      "id": 520,
      "main": "Rain",
      "icon": "09d",
      "description": "light intensity shower rain"
    },
    {
      "id": 701,
      "main": "Mist",
      "icon": "50d",
      "description": "mist"
    }
  ],
  "visibility": 6000,
  "clouds": {
    "all": 75
  },
  "cod": 200,
  "name": "Tokyo",
  "rain": {
    "1h": 0.25
  }
}

ここで取得したデータは、とりあえず保存しておきましょう。

3 node-easymock

続いて、ローカルにモックサーバを立てるのですが、今回は、node-easymockを利用させて頂きました。
https://github.com/CyberAgent/node-easymock

(1) インストール

node-easymockは、下記のコマンドで階層下のディレクトリにインストールされます。

$ npm install easymock

インストールが成功すると、node_modulesの下に、easymockがインストールされていることを確認できます。

ls -la node_modules/
total 0
drwxr-xr-x   4 sin  staff  136  7 13 18:04 .
drwxr-xr-x   3 sin  staff  102  7 13 18:04 ..
drwxr-xr-x   3 sin  staff  102  7 13 18:04 .bin
drwxr-xr-x  13 sin  staff  442  7 13 18:04 easymock

(2) レスポンス作成

続いて、サーバから返すレスポンスを設定します。

アクセスしたいURLが /data/2.5/weather なので、/data/2.5/ のフォルダを作成して、その中に weather_get.json を作成します。 そして、その中に先ほど取得したデータを入れます。

$ mkdir data;mkdir data/2.5
$ echo '{"base":"stations","id":1850147,"dt":1468400024,"main":{"humidity":94,"temp_max":28.89,"temp_min":25,"temp":26.65,"pressure":999},"coord":{"lon":139.69,"lat":35.69},"wind":{"speed":2.1,"deg":130},"sys":{"id":7619,"message":0.0151,"country":"JP","type":1,"sunset":1468403883,"sunrise":1468352145},"weather":[{"id":520,"main":"Rain","icon":"09d","description":"light intensity shower rain"},{"id":701,"main":"Mist","icon":"50d","description":"mist"}],"visibility":6000,"clouds":{"all":75},"cod":200,"name":"Tokyo","rain":{"1h":0.25}}' > ./data/2.5/weather_get.json

レスポンス用のJSONファイルに < @headerを追加すると、ヘッダーを付与することもできます。 < @header Location: http://www.pa-rk.co.jp/

(3) config.jsonの設置

node-easymockを起動するディレクトリにconfig.jsonを作成します。内容は、とりあえず下記のようなもので大丈夫です。

$ echo '{ "simulated-lag": 1000 }' > config.json

simulated-lagは、応答待ち時間の設定です。特定のパスごとに、応答待ち時間を設定することも可能です。

(4) easymockの起動

下記のコマンドでeasymockは起動できます。 起動すると、デフォルトでポートで3000で接続を待ち受けます。

$ node_modules/easymock/bin/easymock
Server running on http://localhost:3000
Listening on port 3000 and 3001
Documentation at: http://localhost:3000/_documentation/
Logs at:          http://localhost:3000/_logs/

-p オプションで任意のポート番号を指定することも可能です。 $ easymock -p 3001

ブラウザで接続すると、モックサーバから応答が返ってきていることを確認できます。

002

この時、コンソールには、次のようなアクセスログも出力されています。

==> /tmp/WeatherInformationSample-mock//data/2.5/weather_get.json

4 接続先の変更

モックサーバが準備できたので、接続先を http://localhost:3000 に変更します。

003

変更後も、本物のサーバにアクセスした時と同じようにレスポンスを得ることができています。上の図では、モックサーバーのログも確認されています。

なお、この際、シュミレーターであれば、接続先はlocalhostでいいですが、、実機で動作確認する場合は、node-easymockの動作する端末と、実機(iPhone端末)を同じWifiアクセスポイントに接続し、node-easymockのIPアドレスを指定する必要があります。

5 実装

接続先がモックになったので、遠慮なくアクセスが可能です。 下の図は、天気アイコンと幾つかの情報を表示してみたものです。

004

レスポンスは、先のJSONを編集することで、自由に変更できますので、気分が良いように晴天にしておきました。

005

6 最後に

今回は、モックサーバーとしてnode-easymockを使用させて頂きました。

いつでも、このようなモックサーバーを軽易に立ち上げられるように、日頃から準備しておきたいと感じました。

参考までに、作成したサンプルは、ここに置いておきます。
github [GitHub] WeatherInformationSample

7 参考資料


https://github.com/CyberAgent/node-easymock
OpenWeatherMap
OpenWeatherMap で気象情報をゲットしよう
JSON整形