ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

AndroidでKtorを使って通信してみた

こんにちは、Andoridエンジニアのジャズニーです。

最近毎日が暑くて、暑さ慣れしているはずなのにエアコンとTereré(テレレ)無しでは生きていけない状態です。

ほとんどのエンジニアがAndroidでネットワーク通信をしたいと考えたとき、一番最初に思い浮かぶはRetrofitではないでしょうか?

ついRetrofitを使ってしまう様々な大人な理由は一旦おいておいて、他に選択肢はないものかとググってみたら、KotlinネイティブでマルチプラットフォームなライブラリKtorを見つけたのでこれを使ってAndroidで通信をしてみようと思います。

TLDR

AndroidでKtorを使用して、郵便番号検索APIにユーザーが入力した郵便番号を元に該当する住所の一覧を表示するアプリを作る。

Just show me the code!


ステップ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-Typeapplication/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として取得にトライ。

次にAddressApiAddressRepositoryに設定します。

ステップ5 AddressRepositoryの住所検索を呼び出す

最後のステップになりました。
実際に取得する処理を実装します。
UIのボタンクリックでViewModelを使って、非同期で通信し、レスポンスを受け取ったらUIを更新します。

まとめ

KtorでもRetrofit同様に通信ができます。
Kotlin MultiplatformのようにKotlinを使ったマルチプラットフォーム開発では、Ktorの方が手軽にコードを再利用できるので便利だと思います。 

個人的にはKtorの書き方の方がしっくりきました。わざわざRetrofitの実装をKtorに置き換えようとは思いませんが、新たなプロジェクトの候補として使ってみるのはいいと思います。

ユニファではプロダクトを一緒に創っていく仲間を募集しています!

unifa-e.com