ちょっと話題の記事

[Android]retrofitとkimonoで作るお手軽RESTアプリケーション

2015.07.07

kimonoについて

まずはWEBページのデータを取得してAPI化してくれるサービスkimonoの使い方から説明します。

kimonoはプログラミングが一切不要で、WEBページからデータの抽出をしてくれるとても便利なWEBサービスです。

定期的に指定したURLの情報を取得してjsonやCSVで出力したり、情報に変更があったら指定のURLに通知したりといった事がブラウザ上から簡単に設定できます。

https://www.kimonolabs.com/

ではまず上記リンクからアカウント登録を行い、chromeエクステンションが用意されているのでchrome上から色々試していきます。

アカウント登録とchromeエクステンションの導入部分は省略いたします。

今回はDevelopers.IOのサイトから記事のタイトルを取得してAndroid端末に一覧を表示させる所までをやってみようと思います。

データを取得したいWEBページを開いて、chromeエクステンションの「kimono」アイコンをクリックします。

kimono_icon

上部にkimonoのメニューバーが表示されます。記事タイトルや説明文など、取得したい箇所をクリックするとその箇所が強調表示されます。

この強調表示された部分がAPIに含まれるプロパティになります。

kimono_menu

クリックした箇所以外にも同じような要素が複数マークされるので、プロパティに含めたい場合はチェックマークをクリックします。いらなければ×をクリックします。

取得したいデータの選択が終わったらメニューバー右上のDoneをクリックします。

kimono_done

このような画面が表示されるのでAPIの名前を付けてCreate APIを押すとリンクが作成され、APIのできあがりです。/apis/**** の部分をクリックして設定画面に飛びます。

kimono_apiname

DATA RREVIEW では取得できるjsonなどのデータ構造が確認できます。CRAWL SETUPではクロールさせる間隔や、クロールさせるURLの追加等が行えます。今回はこの辺は特に変更はせずそのままにしておきます。

スクリーンショット 2015-07-07 18.48.47

API DOCSではAPIKeyや各言語でのサンプルコードを確認できます。データを取得するにはAPIのURLとAPIkeyのパラメータが必要になるので、サンプルコードを参考に下記のようなURLになることを覚えておきます。

https://www.kimonolabs.com/api/*******?apikey=***********************

kimono_api_docs

ブラウザでこのURLにアクセスして見てみましょう。取得できたデータが表示されます。

スクリーンショット 2015-07-07 18.58.01

これでWEBページをスクレイピングしてくれるAPIの完成です。お手軽ですね。

APIができたので、次にAndroid側の実装に移ります。

Android編

retrofitと、今回はAPIから取得するjsonのパースにGsonを使用します。retorofitにはGsonコンバーターという機能があるので簡単に連携することができます。

gradleに以下を追記します。

compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'com.google.code.gson:gson:2.2.4'

retrofitはGET・POSTのREST通信をお手軽に書けるようにしてくれるAndroid,JAVAライブラリです。

まずはHTTPリクエスト用のインターフェースを定義します。

public interface ApiService {

    @GET("/api/hoge")
    void getData(@Query("apikey")String key, Callback<GsonResponse> cb);
}

GETアノテーションでリクエスト先のパスを指定(kimonoで作られた/api/****の部分ですね)

クエリパラメータを第一引数で指定(kimonoで作られたapikeyを渡す部分です,)、第二引数にコールバック(Gsonでパースされるjsonのオブジェクト型を指定)

Gsonでjsonから変換されるクラスは以下のように作成しました。kimonoから取得できるjsonの型に合わせてモデルを定義します。

public class GsonResponse {

    public String name;
    public String count;
    public String frequency;
    public String version;
    public String newdata;
    public String lastrunstatus;
    public String thisversionstatus;
    public String thisversionrun;
    public results results;

    public GsonResponse() {
    }

    public class results {
        public collection1[] collection1;
    }

    public class collection1 {
        public property1 property1;
        public String index;
        public String url;
    }

    public class property1 {
        public String href;
        public String text; //記事タイトル
    }
}

Activity内での実装部分はこちらです

//アダプターのセットアップ
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint("https://www.kimonolabs.com")
                .setConverter(new GsonConverter(new Gson()))
                .build();

        //インターフェースの実装
        ApiService api = restAdapter.create(ApiService.class);

        api.getData("kimonoのAPIkey", new Callback<GsonResponse>() {

            @Override
            public void success(GsonResponse gsonResponse, Response response) {
                for (int i = 0; i < gsonResponse.results.collection1.length; i++) {
                    SampleData data = new SampleData();
                    data.setTitle(gsonResponse.results.collection1[i].property1.text);
                    list.add(data);
                }
                //RecyclerViewのアダプター
                adapter.setAllData(list);
            }

            @Override
            public void failure(RetrofitError error) {
                Log.d("response", error.toString());
            }
        });

        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerView.setAdapter(adapter);

RestAdapter.build()でアダプターのセットアップを行い、RestAdapter.create()で先ほど作成したリクエスト用インターフェースの実装を行います。

Callbackの実装を記述します(例としてRecyclerViewのAdapterに渡すリストを作成してセットしています)

RecyclerViewのAdapter等は基本的な記述になってますので省略いたします。

今回は表示させるだけの目的なので最低限のコード量ですが、他にも様々な機能があるのでよろしければこちらの記事などもご参考ください。 [Android] OkHTTP + Retrofit + RxAndroid で REST クライアントを実装する

では実行してみます。

retoro_m

取得できた記事タイトルがちゃんと表示されました。

まとめ

サーバーのバックエンドや難しい通信処理を用意しなくても、好きなWEBページの欲しい情報だけを気軽に手元の端末に持つことができますね。