Play Frameworkで東京メトロオープンデータのAPIにアクセスしてみる

東京メトロオープンデータのAPIが先日公開されました。 実際にPlay Frameworkを使ってAPIにアクセスしてみたいと思います。

あらかじめ東京メトロオープンデータのアカウントを作成し、APIKeyを取得しておきましょう。

Play Frameworkのアプリを作る

今回はPlay Framework2.3をベースに作成します。 アプリケーションの作成手順やGithubへのプッシュ方法についてはこちらのWikiなどを参考にするとよいかと思います。

さて、PlayFrameworkの準備ができた状態から話を始めましょう。

APIKeyをセットする

まずはAPIKeyを設定ファイルから読み込むようにします。

conf/apikey.conf

# This is the api key file for the application.
# ~~~~~
application.apikey=""
application.apikey=${?MY_API_KEY_ENV}

上の行に開発の時に使うAPIKeyを入れておきましょう。 2行目は本番環境などで環境変数からAPIKeyを読み込むための設定になります。

conf/application.conf

include "apikey.conf"

apikey.confを読み込む設定を追記しておきます。環境によって変わる値はこのように外部ファイルにしておくことで管理が楽になります。

APIにアクセスする機能を作る

app/controllers/Application.java

package controllers;

import play.Play;
import play.libs.F.Function;
import play.libs.F.Promise;
import play.libs.ws.WS;
import play.libs.ws.WSResponse;
import play.mvc.Controller;
import play.mvc.Result;

public class Application extends Controller {

    public static Promise<Result> index() {
        String apikey = Play.application().configuration()
                .getString("application.apikey");
        StringBuilder builder = new StringBuilder();
        builder.append("https://api.tokyometroapp.jp/api/v2/datapoints?");
        builder.append("rdf:type=odpt:TrainInformation");
        builder.append("&");
        builder.append("acl:consumerKey=");
        builder.append(apikey);

        final Promise<Result> resultPromise = WS.url(builder.toString()).get()
                .map(new Function<WSResponse, Result>() {
                    public Result apply(WSResponse response) {
                        return ok(response.asJson());
                    }
                });
        return resultPromise;
    }

}

Play Frameworkでは外部のAPIにアクセスするための機構があるので、これを使います。

https://www.playframework.com/documentation/2.3.x/JavaWS

それぞれの処理はこんなことをやっています。

設定ファイルからAPIKeyを取得。

        String apikey = Play.application().configuration()
                .getString("application.apikey");

東京メトロオープンデータAPIにアクセスするためのURLを作成

        StringBuilder builder = new StringBuilder();
        builder.append("https://api.tokyometroapp.jp/api/v2/datapoints?");
        builder.append("rdf:type=odpt:TrainInformation");
        builder.append("&");
        builder.append("acl:consumerKey=");
        builder.append(apikey);

APIにアクセス

東京メトロオープンデータAPIのレスポンスはJSONで帰ってくるので、response.asJson()でJSON形式で返します。

        final Promise<Result> resultPromise = WS.url(builder.toString()).get()
                .map(new Function<WSResponse, Result>() {
                    public Result apply(WSResponse response) {
                        return ok(response.asJson());
                    }
                });

実際にこれで取得したデータがこちらになります。

http://tokyometroapp.herokuapp.com/

Herokuのサイトから対象となるアプリの「Settings」の中にある「Config Variables」に * KEY:MY_API_KEY_ENV * VALUE:APIのKey を登録してあげることでAPIキーを晒さずに済みます。

Githubにリポジトリをおいてあるのでご参考に。

結構簡単にAPIにアクセスできますね!