fuel-coroutinesを使った非同期HTTP通信がとても簡単だったのでメモ。
Fuel自体はKotlin全般で利用できますが、今回はAndroidアプリ開発を想定しています。
Fuelとは
KotlinでHTTP通信できるライブラリです。こちらにわかりやすく使い方がまとまっています。
FuelのGitHubリポジトリを見るとわかると思うのですが、いろんなパッケージの集合体という形をとっています。今回利用するfuel-coroutinesはその中の一つです。
なぜfuel-coroutinesなのか
Fuelの特徴として「同期でも非同期でも書ける」というものがありますが、fuelのみだと非同期まわりの融通があまり効きません。結局「自前のコルーチンに同期処理を書く」ということになります。
fuel-coroutinesはKotlinのコルーチンライブラリであるKotlinX Coroutinesを利用しているため、コルーチンが扱いやすいです。
また、KotlinX Coroutinesと同じ書き方(というか同じものですが)でコルーチン制御できるため、検索しやすいです。(Kotlinのコルーチンについてはこちらがわかりやすいです。)
AndroidはメインスレッドでWebリクエストが送れないので、素直にfuel-coroutinesを使ったほうが色々楽です。
依存関係を書く
Build.gradleに依存関係を書きます
dependencies {
implementation "com.github.kittinunf.fuel:fuel:2.2.1"
implementation "com.github.kittinunf.fuel:fuel-android:2.2.1"
implementation "com.github.kittinunf.fuel:fuel-coroutines:2.2.1"
}
fuelは様々なパッケージの集合体ですが、今回使うのはfuel
fuel-android
fuel-coroutines
です。3つともgradleに書きましょう。
使ってみる
まずはサンプルを少し変えたものを。
val url = "https://hoge.con"
val tag = "hoge"
runBlocking {
val (request, response, result) = url.httpGet().awaitStringResponseResult()
result.fold(
{ data -> Log.d(tag, data)},
{ error -> Log.e(tag, "An error of type ${error.exception} happened: ${error.message}") }
)
}
見ての通りWebリクエストに成功したときはresult.fold
の第一引数の関数が、失敗のときは第二引数の関数が実行されます。
リクエストパラメータを追加したいときはhttpGet
の引数にlistOf(key to value)
を受け渡しましょう。
画像をダウンロードする
// imageにrunBlockingの計算結果を代入
val image = runBlocking {
val (_, _, result) = url.httpGet().awaitByteArrayResponseResult()
// http通信に成功した場合Bitmap、失敗した場合nullがdataに入る
val data = result.fold(
{res-> res},
{error->
Log.e(tag, "An error of type ${error.exception} happened: ${error.message}")
null
}
)
//ここでダウンロードした画像をBitmap形式に変換する。
BitmapFactory.decodeByteArray(data, 0, data!!.size)!!
}
敢えてさっきとは色々違う書き方をしましたが、基本的な違いはawaitStringResponseResult
がawaitByteArrayResponseResult
に変わっただけです。