Ktor触ったことなかったので、IntelliJ IDEAのプラグイン使ってさくっと動かしてみた。
準備
IntelliJ IDEA(使ったバージョン2018.3)にKtor - Plugins | JetBrainsをインストールします。
プラグイン使って雛形プロジェクトの作成
IntelliJ IDEA - Quick Start - Ktorを参考にプロジェクトを作成します。
画面にHello World表示するのに必要そうなFreemarkerにチェックをします。
プロジェクトはこんな感じに生成されます。ディレクトリの構成はGradleの構成とはちょっと変えてるみたいですね。
出力されたソースコード
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が表示されます。
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が表示されました。ちゃんと動きましたね。
Hello Worldを返すAPIを追加してみる
今までは画面だったので、最後にJsonでHello 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にアクセスするとJsonでHello Worldを返すようにしてみます。
get("/hello_json") { call.respond(Message("Hello World!")) }
動かしてみると
Jsonでちゃんと返してきてくれましたね。