KtorとFuelでAPIアクセスするWebアプリを作ってみました。

こんにちは。虎の穴ラボ所属のH.Kです。
虎の穴ラボではKotlinを使っていますが、書き方の勉強も兼ねてKtorとFuelを使った簡単なWebアプリケーションを作成してみました。

完成形は以下の画像のような感じです。

f:id:toranoana-lab:20190918115542p:plain
一覧画面のイメージ

作成したプロジェクトの主な技術要素

  • Kotlin
  • Ktor
  • Fuel

作業環境

  • macOS
  • IntelliJ

選定理由など

Ktor

ktor.io

2018年11月に正式リリースされたKotlin100%のWeb Frameworkです。
選定理由としては因果が逆転しますが、今回はこれを試すためにこのアプリケーションを作りました。
現在、業務ではサーバサイドKotlinをSpringで動かすことが多いのですが、今後業務で使用することも想定して良い点や悪い点を見つけていければと思います。

Fuel

github.com

Http Clientを探していたのですが、以下に記載があったので選びました。 kotlinlang.org

こちらもお試し的な要素が強いです。
KtorではKtor Project Generatorという、Springで言うところのSpring Initializrのようなものも用意されており、
Http Clientとして、Apache、CIO、Jettyから選択できますが、 短い記述で簡潔に実装できる点や、同期・非同期の実装も容易な点(後述)に惹かれてFuelを選びました。

作ったプロジェクト

とらのあなのキャンペーンのAPIが公開されているので、今回はそれを利用しました。
APIの詳細は以下に記載していますので、ぜひ使ってみてください。

github.com

処理としては、上記のAPIより受け取ったデータを一覧画面と詳細画面に表示するだけの非常にシンプルなものです。
テンプレートエンジンにはThymeleafを使用しました。

Ktor、Fuelについての所感

どちらも魅力的なライブラリだと感じました。
Ktorは、よりKotlinらしくリクエストを捌けますし、
Fuelは余計な記述なくHttp Clientとしての役割を果たしてくれます。

Ktorでやりにくかったと感じた点は、大規模なプロジェクトになった際のルーティングについてです。
今回作成したアプリケーションではio.ktor.locationsを使用したのですが、ネストして定義するとやや読みにくく、
フラットに定義すると冗長になるというジレンマを抱えてしまいました。

//ネストで記述
//infoへのアクセスはparam.id.info
@Location("/detail/{id}")
data class CampaignId(val id: String){
  @Location("/edit")
  data class CampaignInfo(val info: String)
}
//ネストせずに記述
//infoへのアクセスはparam.info
@Location("/detail/{id}")
data class CampaignId(val id: String)
@Location("/detail/{id}/edit")
data class CampaignInfo(val id: String,val info: String)

Fuelについては謳い文句通りに短い記述でHTTPアクセスでき、個人で作成する分には使い勝手が良さそうです。
GETアクセスなら以下の記述だけでできます。

//同期処理
val (request, response, result) = Fuel.get(url).header(attributes).responseString()
//非同期処理
Fuel.get(url).header(attributes).responseString{request, response, result -> 
  //レスポンスに対する処理を記述
}

また拡張関数によって以下のような記述でもアクセスできます。

url.httpGet().responseString()

プロジェクトでの利用については認証周りを今回確認できていないので、もう少し調べて、使ってみて検討したいと思います。

まとめ(今後について)

今回は最小限の実装しか行わなっておらず、ソースコード全体を公開できるようなものにはなっていないので、いずれはコードを整えて公開していければと思います。
その際にはエラーハンドリングや検索機能の拡張などを追加したいです。
またKtorについては業務でも使用すべく、どのようなプロジェクトに合っているのかをよく吟味して、利用を進言していければと考えています。

P.S.

虎の穴では一緒に働く仲間を絶賛募集中です! この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。 yumenosora.co.jp

また、9/25(水)には2回目となる渋谷採用説明会を開催いたします。ご興味のある方は是非ご応募ください! yumenosora.connpass.com

さらに、10/9(水)には秋葉原採用説明会を開催いたします。こちらも、ご興味のある方は是非ご応募ください! yumenosora.connpass.com