こんにちは、Andoridエンジニアのジャズニーです。
最近毎日が暑くて、暑さ慣れしているはずなのにエアコンとTereré(テレレ)無しでは生きていけない状態です。
ほとんどのエンジニアがAndroidでネットワーク通信をしたいと考えたとき、一番最初に思い浮かぶはRetrofitではないでしょうか?
ついRetrofitを使ってしまう様々な大人な理由は一旦おいておいて、他に選択肢はないものかとググってみたら、KotlinネイティブでマルチプラットフォームなライブラリKtorを見つけたのでこれを使ってAndroidで通信をしてみようと思います。
TLDR
AndroidでKtorを使用して、郵便番号検索APIにユーザーが入力した郵便番号を元に該当する住所の一覧を表示するアプリを作る。
ステップ1: Ktorをプロジェクトに追加する
最初にAndroidプロジェクトのapp/build.gradle
にKtorを追加します。
io.ktor:ktor-client-android
→ Android用のHTTPクライアントエンジン
io.ktor:ktor-client-content-negotiation
→ クライアントがどのようなレスポンスを処理するのかを設定する 例)JSON、XMLなど
io.ktoe:ktor-client-logging
→ HTTPクライアントのアクションをログ出力する
io.ktor:ktor-serialization-kotlinx-json
→ JSONの変換をする
org.slf4j:slf4j-android
→ Ktorのログ出力に必要なライブラリ
io.ktor:ktor-serialization-kotlinx-json
が正しく動作するように次の設定もお忘れなく!
app/build.gradle
にプラグインの追加
build.gradle
にレポジトリを追加
buildscript
はファイルの一番最初に記載することをお忘れなく
これで設定はひと段落、Sync Project with Gradle Filesの後にKtorを使う準備が整います。
ステップ2 DTO-Domainクラスの作成
APIのレスポンスの仕様を見て次のようなDTOクラスを作成しました。
ステップ3 Ktorのクライアントを設定
Ktorが使用するHTTPクライアントを設定を行います。他にもOkHttpが使えが、詳しくドキュメンテーションで確認できます。
engine
→ タイムアウトなどを設定を追加
install
→ 使用するKtorのモジュールを追加しています。
ContentNegotiation
→ コンテンツ交渉のプラグインをインストールし、レスポンスとして期待しているContentTypeがJSONであることを設定します。
Json{}
→ KotlinxSerializationConverterを使うことを指定します。
今回使用しているAPIのレスポンスのContent-Type
がapplication/json
ではなく、text/plain
になっていたので二つ目の引数でContent-type: text/plain
に変更する必要があります。
ステップ4 AddressRepositoryとAddressApiクラスの作成
Retrofitと違ってKtorでリクエストを作成するときにはinterfaceを使いません。
そのかわりに、ステップ3で設定したクライアントにHTTPリクエストメソッド(GET, POST, PUT, DELETEなど)に該当するメソッドを呼び出して、URLを渡してリクエストします。
なので、Retrofitに比べてある程度自由度があります。 今回はAddressApi
クラスを使って実装をします。
ktorClient.get
→ GETリクエストを行うことを定義し、url()
でURLを設定parameter()
で郵便番号のパラメータを追加。
body()
→ でレスポンスボディーをAddressResponse
として取得にトライ。
次にAddressApi
をAddressRepository
に設定します。
ステップ5 AddressRepositoryの住所検索を呼び出す
最後のステップになりました。
実際に取得する処理を実装します。
UIのボタンクリックでViewModelを使って、非同期で通信し、レスポンスを受け取ったらUIを更新します。
まとめ
KtorでもRetrofit同様に通信ができます。
Kotlin MultiplatformのようにKotlinを使ったマルチプラットフォーム開発では、Ktorの方が手軽にコードを再利用できるので便利だと思います。
個人的にはKtorの書き方の方がしっくりきました。わざわざRetrofitの実装をKtorに置き換えようとは思いませんが、新たなプロジェクトの候補として使ってみるのはいいと思います。
ユニファではプロダクトを一緒に創っていく仲間を募集しています!