Android Retrofit 2 を使った Http通信
今日はRetrofit2を使ってAndroidのHttpレスポンスの実装方法を紹介したいと思います。
Retrofit2って?
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);
と記述します。このようにして先ほど作成したインタフェースを呼び出すのです。
ここで addConvertFactory
で GsonConverterFactory.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.x対応 プロが本気で教えるアプリ作りの基本「技」 (ヤフー黒帯シリーズ)
- 作者: 森洋之
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/07/29
- メディア: 単行本
- この商品を含むブログを見る
超初心者でも大丈夫! はじめてのAndroidプログラミング Android Studio 2対応
- 作者: 金田浩明
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/04/30
- メディア: 単行本
- この商品を含むブログ (1件) を見る