しおしお

IntelliJ IDEAのことなんかを書いてます

KtorでHello World

Ktor触ったことなかったので、IntelliJ IDEAのプラグイン使ってさくっと動かしてみた。

準備

IntelliJ IDEA(使ったバージョン2018.3)にKtor - Plugins | JetBrainsをインストールします。

プラグイン使って雛形プロジェクトの作成

IntelliJ IDEA - Quick Start - Ktorを参考にプロジェクトを作成します。
画面にHello World表示するのに必要そうなFreemarkerにチェックをします。
f:id:sioiri:20190120062943p:plain
プロジェクトはこんな感じに生成されます。ディレクトリの構成はGradleの構成とはちょっと変えてるみたいですね。
f:id:sioiri:20190120063454p:plain

出力されたソースコード

HELLO WORLDをtext/plainで返すルートと画面を返すルートが定義されています。

    routing {
        get("/") {
            call.respondText("HELLO WORLD!", contentType = ContentType.Text.Plain)
        }

        get("/html-freemarker") {
            call.respond(FreeMarkerContent("index.ftl", mapOf("data" to IndexData(listOf(1, 2, 3))), ""))
        }
    }

動かしてみる

アプリケーションを起動してみます。ログから8080ポートでアプリケーションが起動されたことが確認できます。

2019-01-20 06:40:16.468 [main] INFO  Application - No ktor.deployment.watch patterns specified, automatic reload is not active
2019-01-20 06:40:17.795 [main] INFO  Application - Responding at http://0.0.0.0:8080

ブラウザでアクセスすると、HELLO WORLDが表示されます。
f:id:sioiri:20190120064218p:plain

View(FreeMarker)でHello Worldしてみる

メッセージを保持するクラスを追加します。

data class Message(val text: String)

ルーティングのFreeMarkerの実装を変更し、Hello Worldメッセージを保持するオブジェクトをmodelに設定します。

    routing {
        get("/") {
            call.respondText("HELLO WORLD!", contentType = ContentType.Text.Plain)
        }

        get("/hello") {
            call.respond(FreeMarkerContent("index.ftl", mapOf("message" to Message("Hello World!!!"))))
        }
    }

最後に、レスポンスで指定しているindex.ftl(resources/templates/index.ftl)をメッセージを表示するように変更します。

<#-- @ftlvariable name="message" type="siosio.Message" -->
<html>
    <body>
    メッセージ:${message.text}
    </body>
</html>

動かしてみる

ブラウザでアクセスすると、メッセージとしてHello Worldが表示されました。ちゃんと動きましたね。
f:id:sioiri:20190120065314p:plain

Hello Worldを返すAPIを追加してみる

今までは画面だったので、最後にJsonHello Worldを返すAPIを追加してみます。
HTTP API - Quick Start - Ktorを参考にするのとイケそうですね。

Jsonを返すためにJackson機能を有効にする

ktor-jacksonをbuild.gradleのdependenciesに追加します。

compile "io.ktor:ktor-jackson:$ktor_version"

Application.ktに以下を追加して、jacksonをアプリケーションにインストールします。

fun Application.module(testing: Boolean = false) {
    // 省略
    install(ContentNegotiation) {
        jackson {
            // 確認しやすくするためにインデントして
            enable(SerializationFeature.INDENT_OUTPUT)
        }
    }
    // 省略
}

ルートを追加する

hello_jsonにアクセスするとJsonHello Worldを返すようにしてみます。

        get("/hello_json") {
            call.respond(Message("Hello World!"))
        }

動かしてみると

Jsonでちゃんと返してきてくれましたね。
f:id:sioiri:20190120071400p:plain