tsurutanのつぶやき

備忘録としてつぶやきます

Android Retrofit 2 を使った Http通信

今日はRetrofit2を使ってAndroidのHttpレスポンスの実装方法を紹介したいと思います。

Retrofit2って?

f:id:tsurutan:20161004000732j:plain

Retrofit2はSquare(Jake 神)が開発しているネットワークアクセスライブラリです。

特徴的なのはサーバ側のAPIをインタフェースとして定義することで、API呼び出しの実装とAPI定義を分離しコードの見通しを簡潔に保つことができるという点です。

実装とAPI定義が分離しているため、後からAPIを追加することも容易となり保守性の高い設計ができそうです。

以前まではVolleyが主流でしたが今のイケてるサービスはほとんどRetrofit2を使っているのではないのでしょうか?

使い方

まず、想定として http://example.com/users/tsurutan/get というレスポンスを叩くと

{"user": {
  "id": 100,
  "name": "tsurutan",
}}

といったJsonが返ってくるとします。

この時Retrofit2では

public interface UserService {
  @GET("users/{user}/get")
  Call<User> getUser(@Path("user") String user);
}

このように記述します。

まずAPI用のインタフェースを作成します。

@GET というアノテーションがありますがこれは文字通りゲットレスポンスを表します。@Get以外にも@Post@Deleteなど様々なレスポンスに対応しております。

ただし@Patchは残念ながら存在しない為Postにヘッダーを加えてPatchに変換しないといけません。

また@Postを使ってMultipart通信を行えないのが少し難点かもしれません。。(この場合はIonやVolleyと言ったライブラリーを別途使った方が良いかもしれません)

また @Get( ) の中身にはレスポンスのエンドポイントを記します。

この場合エンドポイントの{user}の部分が各ユーザーごとに異なると思うのでその場合メソッドの引数に @Pathと指定し動的に変更することができます。

そしてCallの型に指定されているUserはgsonを使ったクラスで表されます。

gsonって何?という方に簡単にgsonについて説明したいと思います。

GSONは、Googleが提供するJSONデータとJavaオブジェクトを相互に変換するためのライブラリです。 JavaでJSONを扱うためのライブラリは他にJackson、JSONIC等があります。 GSONのメインとなるのは Gson クラスです。

例えば先ほどの

{"user": {
  "id": 100,
  "name": "tsurutan",
}}

というJsonのレスポンスを

class User {
  private int id;
  private String name;

  public int getId() {
    return id;
  }
  
  public void setId(int id) {
    this.id = id;
  }
  
  public String getName() {
    return name;
  }
  
  public void setName(String name) {
    this.name = name;
  }
}

と言ったクラスを記述することでJsonをオブジェクトにパースしてくれる優れたライブラリーなのです。

注意して欲しいのは変数の名前とJsonのkeyの名前が一致しているということです。

これはgsonが自動的に判断してくれる為あえてこのようにしております。

またkeyにtsuru_tanと言った感じにアンダーバーが入る場合はtsuru_tanとするか、gsonのフォーマット規約を変更してtsuruTanのように記述することもできます。

retrofit 2ではこのgsonを介することでapiから間接的にオブジェクトを取得することができるのです。

次に

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://example.com/")
 .addConverterFactory(GsonConverterFactory.create())
    .build();

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

と記述します。このようにして先ほど作成したインタフェースを呼び出すのです。

ここで addConvertFactoryGsonConverterFactory.create()を渡しているのは先ほど説明したgsonを使う為メソッドを呼び出しております。

そして最後に

service.getUser("tsurutan").enqueue(new Callback<User>() {
            @Override
            public void onResponse(Call<User> call, Response<User> response) {
                if (response.isSuccess()) {
                    //Success !!
                } else {
                    Toast.makeText(getActivity(), getString(R.string.error_text), Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<User> call, Throwable t) {
                Toast.makeText(getActivity(), getString(R.string.error_text), Toast.LENGTH_SHORT).show();
            }
        });

と記入します。getUserで引数にuser名を渡しその後enqueueでコールバックに対するコードを記入します

            @Override
            public void onResponse(Call<User> call, Response<User> response) {
                if (response.isSuccess()) {
                    User user = response.body();
                    //Success !!
                } else {
                    Toast.makeText(getActivity(), getString(R.string.error_text), Toast.LENGTH_SHORT).show();
                }
            }

このメソッドはレスポンスのコードが400~451以外の時に呼び出されます。

またresponse.isSuccess()ではコードが200~226の時にtrueを返します。

そして成功した時にresponse.body()を呼び出すことで、先ほど作成したUserを受け取ることができます。

AndroidにおいてはAPI通信を非同期で行わなければならなく、以前までは非常にこのあたりのコードが長くなっておりました。

しかしこのようなライブラリーの登場でコードの簡潔化、開発の爆速化が実現しました。

Jake神に足を向けて寝ることはもう出来ませんね。

どうやって使うの?

compile 'com.squareup.retrofit2:retrofit:(insert latest version)'

お馴染みapp層のbuild.gradleにこの一行を加えるだけです!

簡単すぎて笑えてきますね!

超初心者でも大丈夫! はじめてのAndroidプログラミング Android Studio 2対応

超初心者でも大丈夫! はじめてのAndroidプログラミング Android Studio 2対応