四畳半の秘密基地

さあ、今日はどんな実験をしよう

MENU

Retrofit2を試してみる

最近RxJavaについて勉強中なんですが、RxJavaで非同期通信を行うときに相性の良いライブラリとしてRetrofitというものがあるという話を聞いて試してみようと思いました。
今回はリクルートさんのグルメサーチAPIを使ってみたいと思います。

まずはbuild.gradleに記述します。

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'
compile 'com.google.code.gson:gson:2.4'


パーミッションも忘れずに

<uses-permission android:name="android.permission.INTERNET"/>




次にAPIのリファレンスやら参考サイトを読みながらPOJOを作っていきます。
リファレンスに書いてあるhttp://webservice.recruit.co.jp/hotpepper/gourmet/v1/?format=json
APIキーを指定して読み込みJSONデータを取得します。
その後、jsonschema2pojoを使ってPOJOを作成します。

Retrofitを使って天気情報を取得してみる【Android】

に詳しく記載があります。

作成したクラスはmodelsパッケージ内に格納しました。
次にRetrofitで通信部分を作成します。

public interface HotPepperService {
    @GET("/hotpepper/gourmet/v1/")
    Call<GourmetData> getGourmetData(@Query("key") String key, @Query("large_area") String area, @Query("format") String format);
}


通信結果を入れるオブジェクトはGourmetDataです。
最初、レスポンスのJSONを見てみるとルートがresultsとなってるのでレスポンスもResultsにしたら動きませんでした。
レスポンスを受け取るオブジェクトはJSONのルートのオブジェクトを持つクラスにしてあげると良いみたいです。


ここからはMainActivityへの記述になります。
まずは、APIインスタンスを作ります。

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://webservice.recruit.co.jp")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

HotPepperService service = retrofit.create(HotPepperService.class);

後は、作成したインスタンスAPIを呼び出すだけです。

Call<GourmetData> call = service.getGourmetData(Environment.API_KEY, "Z012", "json");
call.enqueue(new Callback<GourmetData>() {
    @Override
    public void onResponse(Response<GourmetData> response) {
        List<Shop> shopList = response.body().results.getShop();
        StringBuilder builder = new StringBuilder();

        for (Shop shop : shopList) {
            builder.append(shop.getName() + "\n");
        }
                ((TextView) findViewById(R.id.textview)).setText(new String(builder));
    }

    @Override
    public void onFailure(Throwable t) {
        Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
    }
});

f:id:k-seito:20160130220915p:plain


結果はこんな感じです。とても簡単にできますね。
クエリパラメータをStringBuilderを使ってごにょごにょしてたのがアホらしくなってきました。

https://github.com/kseito/RetrofitPractice/tree/first
ソースはGitHubに置いておきます。