Help us understand the problem. What is going on with this article?

KtorでHello World

More than 1 year has passed since last update.

なぜKtorを試してみようと思ったのか

最近Kotlin盛り上がってるなあと思い,遅ればせながらKotlinスタートブックを読んでいた折に,JetBrains謹製WebフレームワークであるKtorのVersion 1.0.0がリリースされたというニュースをみました.
以前からバックエンドのフレームワークを勉強したいと考えていて,Node.js,Flask,Beegoなどから検討していました.Node.jsと迷いましたが,Javaの経験があるということ,Kotlinの便利そうな文法を試してみたいことから,一先ずKtorを触ってみることにしました.

Ktorって?

Kotlin開発元であるJetBrainsが開発しているWebフレームワークで,ケイターと読みます.Easy to use, fun and asynchronous.を謳っていて,KotlinのCoroutinesを多分に利用しているようです.

目的

せっかくなので,JSONで"Hello World"を返すAPIを作ってみます.

開発および言語環境

OS
macOS Mojave 10.14.1
IDE
IntelliJ IDEA Community Edition 2018.3
Kotlin
1.3.10
Ktor
1.0.0

IDEについてはVisual Studio Codeと迷いましたが,ビルドが少し面倒そうなことと,プラグインがまだ発展途上に思えたこともあり,IntelliJ IDEAにしました.

Let's Hello World!

Ktorプラグインのインストール

Marketplaceからインストールします.
2018-11-25 19.42のイメージ.jpeg

プロジェクトの作成

Ktorプラグインをインストールしたので,プロジェクトの形式にKtorが追加されています.ビルドシステムはGradleが,開発用サーバエンジンはNettyがデフォルトで選択されています.今回はデフォルトのまま進めます.
2018-11-25 20.15のイメージ.jpeg

プロジェクト構成ファイルの確認

application.conf
ktor {
    deployment {
        port = 8080
        port = ${?PORT}
    }
    application {
        modules = [ com.example.ApplicationKt.module ]
    }
}

アプリケーションの各種設定はapplication.confに書くようです.プロジェクト作成直後は,8080ポートでリッスンする設定と,後述のApplication.module関数で指定した機能を,サーバ起動時にロードする設定が書かれています.

Application.kt
fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)

@Suppress("unused") // Referenced in application.conf
@kotlin.jvm.JvmOverloads
fun Application.module(testing: Boolean = false) {
}

main関数内のio.ktor.server.netty.EngineMain.main(args)で開発用のNettyサーバエンジンが開始されます.また,fun Application.module(testing: Boolean = false) {}にアプリケーションで利用する機能を指定します.

Routing機能の追加

早速Routing機能を追加して,一先ずTextを返してみます.

Application.kt
fun Application.module(testing: Boolean = false) {
    routing {
        get("/HelloWorld") {
            call.respondText("Hello World!")
        }
    }
}

デフォルトで用意されているbuild config:com.example.AppicationKtでビルドして実行すると,サーバが起動します.
スクリーンショット 2018-12-01 16.58.11.png
リクエストしてみます.
スクリーンショット 2018-12-01 20.41.05.png
問題なさそうです!簡単ですね :raised_hands:

JSONで返してみる

KtorのContent Negotiation機能とJSON libraryのJacksonを使って実装してみます.

Application.kt
fun Application.module(testing: Boolean = false) {
    install(ContentNegotiation) {
        jackson {
            enable(SerializationFeature.INDENT_OUTPUT)
        }
    }
    routing {
        get("/HelloWorld") {
            call.respond(mapOf("Hello" to "World!"))
        }
    }
}

Routing機能と違い,install(ContentNegotiation)となっています.Routing機能はrouting DSLブロックを使うと自動でインストールされるため,明示的なインストールは必要ありません.再度リクエストしてみます.
スクリーンショット 2018-12-01 20.45.27.png
できました :thumbsup:

所感

他のフレームワークについて詳しくないので比較はできませんが,これだけ簡単に書けるのであれば,ドメインロジックなどのコアな箇所に集中できていいなと思いました(フレームワークってそういうものでしょ?と言われそうですが :innocent: ).公式のドキュメントも充実しているので,基本的なことをやる分には困ることもなさそうです.売りである非同期処理も試してみたいので,次はWebSocketを使った簡単なアプリを作ってみようと思います.

参考サイト

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away