Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

HTTP4K を最小構成で動かす

More than 1 year has passed since last update.

概要

Kotlin 製の Web アプリケーションフレームワーク HTTP4K を使った最小のアプリケーション開発について説明します。

HTTP4K とは?

サーバーサイドのアプリケーションを開発するための Kotlin 製フレームワークです。
Kotlin Conf 2018 のセッション資料だとサーバーレス環境向けのフレームワークという触れ込みですが、単にマイクロWebアプリケーションを開発するのにも使えます。
README を見ると、テストもしやすい設計になっているようです。

なぜ HTTP4K か?

Kotlin は Java のアプリケーションフレームワークを(ほぼ)そのまま使うことができるため、すでに実績のあるフレームワークを用いるという選択肢もあります。
ただ、その方法だと Java の記法上の制約や NonNull/Nullable の穴による意図しない不具合に注意する必要があり、Kotlin を使うメリットが減少しかねません。
フル Kotlin で開発されたアプリケーションフレームワークを使うことで、その問題は解消されます。

また、フル Kotlin のアプリケーションフレームワークはほかにもありますが、 HTTP4K は純粋にアプリケーション開発にフォーカスして開発されているので、
通常の Web アプリケーション開発のコンテクストで開発をすることができます。

一方で、プロトタイピング目的で小さい Web アプリケーションを Kotlin で開発するのであれば、Spark-Java & Spark-Kotlin という選択肢もあります。
そちらに比べると、HTTP4K は記述量がちょっと多くなると感じました。


使ってみる

Hello world

以下のコードで十分です。

import org.http4k.core.Method
import org.http4k.core.Request
import org.http4k.core.Response
import org.http4k.core.Status.Companion.OK
import org.http4k.routing.bind
import org.http4k.routing.routes
import org.http4k.server.SunHttp
import org.http4k.server.asServer

fun main(args: Array<String>) {
    routes("/hello" bind Method.GET to { _: Request -> Response(OK).body("hello!!") })
            .asServer(SunHttp(8000))
            .start()
}

……これで十分ですが、 import が結構多いので手軽感はやや薄いかもしれないです。

Gradle Application Plugin と組み合わせて使う

Java 用の Gradle Application Plugin を使う場合、また IDE に Kotlin の main メソッドを認識させたい場合、object クラスの main メソッドに @JvmStatic アノテーションを付けるとよいらしいです。

object Main {

    @JvmStatic
    fun main(args: Array<String>) {

あとは build.gradle を修正します。具体的には main メソッドのある object クラスの FCDN を mainClassName で指定します。

build.gradle
apply plugin: 'application'

mainClassName = "jp.toastkid.http4k.example.Main"

//...

これで gradle run を実行すればアプリケーションが起動するようになります。

Fat jar

Fat jar を作りたい場合は以下を追記してください。

build.gradle
jar {
    manifest {
        attributes 'Main-Class'   : mainClassName
    }
    destinationDir = projectDir
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}

これで $gradle jar を実行すると Fat jar が出力されます。 出力された Fat jar を使い、 $ java -jar http4k.example-0.0.1.jar を実行すれば、アプリケーションが起動します。

参考

toastkidjp
Web 系企業の Android アプリ開発者です。
https://github.com/toastkidjp
Why not register and get more from Qiita?
  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