Ktor プロジェクトの作成

Ktor とは?
Ktor は Kotlin で書かれたオープンソースの Web フレームワークである。JetBrains によって開発および保守されており、非同期 Web アプリケーションやマイクロサービスの構築に使用される。Ktor は軽量でありながら強力な機能を提供し、Kotlin の簡潔で表現力のある構文を活用して、開発者が Web アプリケーションをすばやく効率的に開発できるようにする。また、組み込み HTTP サーバーを使って単独で実行可能なアプリケーションを作成できる。
はじめに
まず公式ページの Getting Started を参考にして、最初のプロジェクトを作成してみる。
新規 Ktor プロジェクトの作成
ここでは簡単な Ktor アプリケーションを作成し、実行し、テストする方法を紹介する。 Ktor プロジェクトを新しく作成する方法は IDE によって異なる。
- IntelliJ IDEA Ultimate の場合
- 専用プラグインを使用する
- IntelliJ IDEA Community など、それ以外の場合
- Web ベースのプロジェクトジェネレータ を使用する
ここでは Web ベースのプロジェクトジェネレータを使って進める。
Web ベースのプロジェクトジェネレータ
まず Ktor Project Generator に移動し、下記のように設定する。

ここではプロジェクト名以外はデフォルト値のままで問題ない。設定が終わったら “Add plugins” ボタンを押す。
次の画面ではプラグインセットを選択できる。
プラグインセットには、セキュリティ、ルーティング、HTTP、モニタリング、シリアライズ、コンテンツエンコーディング、圧縮、Cookie サポートなど、Ktor アプリケーションの共通機能が用意されている。

ここでは公式手順に従って “Routing” だけを追加してみる。Add ボタンで追加した後、“Generate project” ボタンを押す。

すると zip ファイルがダウンロードされる。ダウンロードしたファイルを展開し、任意のディレクトリに配置する。その後、生成された ktor-tutorial ディレクトリを確認する。ファイルおよびディレクトリ構造は次のとおりである。
% tree
.
├── build.gradle.kts
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── settings.gradle.kts
└── src
├── main
│ ├── kotlin
│ │ └── com
│ │ └── devkuma
│ │ ├── Application.kt
│ │ └── plugins
│ │ └── Routing.kt
│ └── resources
│ └── logback.xml
└── test
└── kotlin
└── com
└── devkuma
└── ApplicationTest.kt
13 directories, 11 files
Ktor アプリケーションの実行
IntelliJ IDEA でプロジェクトを開き、プロジェクトビューから次のパスにある Application.kt を開く。
src/main/kotlin/com/devkuma/Application.kt

開くと、次のようなソースコードがあるはずである。
package com.devkuma
import com.devkuma.plugins.*
import io.ktor.server.application.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
fun main() {
embeddedServer(Netty, port = 8080, host = "0.0.0.0", module = Application::module)
.start(wait = true)
}
fun Application.module() {
configureRouting()
}
主なポイントは次のとおりである。
embeddedServer関数は、コード内でサーバーのパラメータを設定し、アプリケーションを実行するために使用される。configureRoutingはルーティングを定義する拡張関数である。この関数はpluginsパッケージという別パッケージに宣言されており、次のようなコードになっている。
src/main/kotlin/com/devkuma/Application.kt
package com.devkuma.plugins
import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
fun Application.configureRouting() {
routing {
get("/") {
call.respondText("Hello World!")
}
}
}
その後、Application.kt の main function に戻って実行ボタンを押す。
アプリケーションが IntelliJ IDEA で起動するまで待つと、次のようなログを確認できる。
[main] INFO ktor.application - Autoreload is disabled because the development mode is off.
[main] INFO ktor.application - Application started in 0.214 seconds.
DefaultDispatcher-worker-1] INFO ktor.application - Responding at http://0.0.0.0:8080
メッセージの内容そのものよりも、サーバーが http://0.0.0.0:8000 でリクエストを受け付ける準備ができたことを意味しているため、実際にブラウザでアクセスしてみる。
すると Hello World! と表示されることを確認できる。

Ktor アプリケーションのテスト
次に、デフォルトで生成されたテストコードを実行してみる。
次のパスのファイルを開くと、自動生成されたテストコードを確認できる。
src/main/kotlin/com/devkuma/ApplicationTest.kt
package com.devkuma
import com.devkuma.plugins.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.http.*
import io.ktor.server.testing.*
import kotlin.test.*
class ApplicationTest {
@Test
fun testRoot() = testApplication {
application {
configureRouting()
}
client.get("/").apply {
assertEquals(HttpStatusCode.OK, status)
assertEquals("Hello World!", bodyAsText())
}
}
}
ここでは testApplication 関数を呼び出し、/ に GET リクエストを送ってレスポンスのステータスと内容を確認している。
testApplication 関数を実行すると次のようなログを確認でき、テストが正常に完了したことが分かる。
[Test worker @coroutine#1] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http:///
[DefaultDispatcher-worker-1 @call-context#2] INFO ktor.test - No ktor.deployment.watch patterns specified, automatic reload is not active.
[DefaultDispatcher-worker-1 @call-context#2] INFO ktor.test - Application started in 0.015 seconds.
[DefaultDispatcher-worker-3 @coroutine#4] INFO ktor.test - Responding at http://localhost:80
[DefaultDispatcher-worker-3 @coroutine#4] INFO ktor.test - Responding at https://localhost:443
[DefaultDispatcher-worker-1 @request#2] TRACE io.ktor.routing.Routing - Trace for []
... 以下省略 ...
まとめ
今回は Ktor の標準チュートリアルを通じて Hello World! を確認できた。テストコードもデフォルトで提供されている点と、ルーティングコードも直感的で理解しやすく書かれている点が印象的である。