LoginSignup
13
19

More than 5 years have passed since last update.

KtorでHello World

Last updated at Posted at 2018-12-01

なぜ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を使った簡単なアプリを作ってみようと思います.

参考サイト

13
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
19