読者です 読者をやめる 読者になる 読者になる

Retrofit2でどうにかJSONを取得するの巻を解説するの巻

解説。

Gson gson = new GsonBuilder().setLenient().create();

これでGsonとやらのインスタンスを生成する。
GsonというのはJsonJavaに変換してくれる的な奴らしい。
setLenientは厳格なJsonじゃなくても受け入れるようにするらしい。厳格なJsonってなんやねん。

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(URL)     
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build();

baseUrlは名前の通りベースのURLを設定する。 今回はhttp://connpass.com/api/v1/eventAPIのURLなので、 http://connpass.com/をベースする。
別にhttp://connpass.com/api/v1/eventをベースにしてしまってもいい気がするけど、ここは各自自由で。

次にaddConverterFactoryだが、JsonJavaを変換してくれるやつを設定する。今回はGsonを使っているのでGsonConverterFactory.createを使って設定する。引数はさっき生成したインスタンスのgsonを使う。buildは説明するまでもないかな。

Api api = retrofit.create(Api.class);

これはインスタンスを生成しているだけなので特に記述することはないと思う。Apiはインターフェースの名前だ。

Call<Json> call = api.getJson();
call.enqueue(this);

api.getJsonについては後ほど書く。
enqueueは非同期で通信しろというメソッド。引数はコールバックのメソッド。通信が終わり次第呼び出される。
今回のサンプルではMainActivityがコールバックメソッドをimplementsしているのでthisにした。

インターフェース部分について解説する。

public interface Api {
    @GET("/api/v1/event")
    Call<Json> getJson();
}

@GETはベースURLより下の部分を書く。 次にCallを返すメソッドを定義する。CallはRetrofitで定義されているのでそれを使う。カッコのなかはJSONを元に作ったデータクラスを使う。 前回、Webサービスでクラスを作ったのでそれを記述する。 今回はgetJsonという適当なメソッド名にしたが、あなたはもっとイカした名前のものにするといい。

もし、あなたがクエリを使って見たい場合は、こう記述する。

public interface Api {
    @GET("/api/v1/event")
    Call<Json> getJson(@Query("count") int count);
}

こう記述した場合、呼び出すときにはこうする。

Call<Json> call = api.getJson(10);
call.enqueue(this);

こうすると、送り先がhttp://connpass.com/api/v1/event?count=10というふうになる。クエリを複数書きたいときはカンマ区切りにすればできると思う。

最後にコールバック部分。

@Override
public void onResponse(Call<Json> call, Response<Json> response) {
    System.out.println(call.request().url());
    if (response.code() == 200){

        List<Event> events = response.body().getEvents();

        for (Event e:events){
            System.out.println(e.getTitle());
        }
    }
}

@Override
public void onFailure(Call<Json> call, Throwable t) {
    Toast.makeText(getApplicationContext(),t.getMessage(),Toast.LENGTH_SHORT).show();
    t.printStackTrace();
}

onResponseは通信に成功した時、onFailureは失敗した時に呼び出される。
onResponseはコードが何であろうと呼び出されるので注意すること。404でも普通に呼ばれる。注意しないとぬるぽで落ちる。
responce.body()はレスポンスを取得できる。そこからgetなんちゃらで詳細を持ってこれる。なにが取得できるかはデータクラスを見てみればなんとなくわかるはずだ。
call.request().url()は送信先のURLを取得できる。404とかになったときに確認するといいと思う。

おわりに

大体こんな感じかな、Android Studioは予測でいっぱい出してくれるのでCallとかResponceはなにが取得できるのかを試しておくといいと思う。
今回のサンプルはとりあえず取得できる程度なので、複数のAPIから取得したいとかListViewとかで表示したい場合はちょっと工夫したらできそうではある。

参考資料

retrofit2 (Retrofit 2.1.0 API)

【Android】【Retrofit】Retrofit 2.0.1使い方メモとハマりどころメモ - Tumbling Dice