Ktor プロジェクトの作成

Ktor フレームワークを使ってプロジェクトを作成する方法を説明する。

Ktor

Ktor とは?

Ktor は Kotlin で書かれたオープンソースの Web フレームワークである。JetBrains によって開発および保守されており、非同期 Web アプリケーションやマイクロサービスの構築に使用される。Ktor は軽量でありながら強力な機能を提供し、Kotlin の簡潔で表現力のある構文を活用して、開発者が Web アプリケーションをすばやく効率的に開発できるようにする。また、組み込み HTTP サーバーを使って単独で実行可能なアプリケーションを作成できる。

はじめに

まず公式ページの Getting Started を参考にして、最初のプロジェクトを作成してみる。

新規 Ktor プロジェクトの作成

ここでは簡単な Ktor アプリケーションを作成し、実行し、テストする方法を紹介する。 Ktor プロジェクトを新しく作成する方法は IDE によって異なる。

ここでは Web ベースのプロジェクトジェネレータを使って進める。

Web ベースのプロジェクトジェネレータ

まず Ktor Project Generator に移動し、下記のように設定する。

Ktor

ここではプロジェクト名以外はデフォルト値のままで問題ない。設定が終わったら “Add plugins” ボタンを押す。

次の画面ではプラグインセットを選択できる。

プラグインセットには、セキュリティ、ルーティング、HTTP、モニタリング、シリアライズ、コンテンツエンコーディング、圧縮、Cookie サポートなど、Ktor アプリケーションの共通機能が用意されている。

Ktor

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

Ktor

すると 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

Ktor

開くと、次のようなソースコードがあるはずである。

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

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! を確認できた。テストコードもデフォルトで提供されている点と、ルーティングコードも直感的で理解しやすく書かれている点が印象的である。