Retrofit による HTTP 通信

Android で HTTP 通信をする際に便利なライブラリを Retrofit を紹介します。 簡単な通信な…

Android で HTTP 通信をする際に便利なライブラリを Retrofit を紹介します。
簡単な通信なら自力で HttpURLConnection を使って実装すれば問題ないですが、
様々な API を叩くのであれば Retrofit が良いでしょう。

Retrofit とは


Android 向けの HTTP クライアントです。
Java のインターフェイス形式で API の定義ができるようになっています。

public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}

この例ですと、 /users/:user/repos に対して GETメソッドで通信するという意味になります。
listRepos メソッドの引数に @Path(“user”) アノテーションを設定することで user に指定したものが :user に置き換わって通信されます。レスポンスは直接 Repo 型のリスト形式となって格納されます。
 
呼び出し側は以下のように、上記で作成した GitHubService インスタンスを生成した後にメソッドを呼び出すだけ。

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();
GitHubService service = retrofit.create(GitHubService.class);
Call<List<Repo>> repos = service.listRepos("octocat");

 

他ライブラリとの連携


素の機能だけでも十分便利ですが、他のライブラリと連携すると更に強力になります。
通信クライアントの設定や、jsonのレスポンスを変換したりなどできるようになります。
 

OkHttp

HTTP クライアントとして OkHttp の設定ができます。
これを設定するとヘッダー・ログ取得の設定や、通信タイムアウトの設定などができるようになります。
 

Converters

レスポンスを OkHttp の ResponseBody 型としてしか受け取れませんが、コンバーターを設定すると直接オブジェクトに格納できるようになります。
json を変換する Gson や xml を変換する Simple XML などが利用できます。
 

RxAndroid

レスポンスの型は Call として受け取ることが基本となっていますが、 RxAndroid とも親和性が高く Observable を戻り値に設定することが可能なので、リアクティブプログラミングも対応しています。

実装のイメージとしてはこんな感じです (Kotlin) 。

// Httpヘッダ設定
val okHttpClientInterceptor = Interceptor { chain ->
    val request = chain.request().newBuilder().apply {
        addHeader(HttpHeaders.AUTHORIZATION, "Bearer ...")
    }.build()
    chain.proceed(request)
}
// Httpクライアント設定
val okHttpClient = OkHttpClient.Builder().apply {
    addInterceptor(okHttpClientInterceptor)
    connectTimeout(5, TimeUnit.SECONDS)
    readTimeout(5, TimeUnit.SECONDS)
}.build()
// 通信
val retrofit = Retrofit.Builder().apply {
    baseUrl(API_BASE_URL)
    client(okHttpClient)
    addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    addConverterFactory(GsonConverterFactory.create())
}.build()
val api = retrofit.create(GitHubService::class.java)
api.listRepos("hoge")
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(object : Observer<MutableList<Repo>> {
        override fun onSubscribe(d: Disposable?) {
            Log.d("RxAndroid", "実行開始")
        }
        override fun onNext(t: MutableList<Repo>?) {
            Log.d("RxAndroid", "処理完了")
            t?.forEach { item ->
                Log.d("RxAndroid", item.toString())
            }
        }
        override fun onComplete() {
            Log.d("RxAndroid", "実行完了")
        }
        override fun onError(e: Throwable?) {
            Log.e("RxAndroid", "エラー")
        }
    })

 

まとめ

紹介した他にも、マルチパートで POST なども可能です。
Retrofit を使うと至れり尽くせりの恩恵を享受できるので、通信処理を実装する際には選択肢の内に入れても良いかと思います。