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);
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(); } });
結果はこんな感じです。とても簡単にできますね。
クエリパラメータをStringBuilderを使ってごにょごにょしてたのがアホらしくなってきました。
https://github.com/kseito/RetrofitPractice/tree/first
ソースはGitHubに置いておきます。