KtorlinとKtor

Ktorとコトリン

1. 概要

Ktorは、強力なKotlinプログラミング言語を使用して、接続されたシステムに非同期サーバーとクライアントを構築するためのフレームワークです。 サーバーが組み込まれたスタンドアロンアプリケーションの開発を容易にします。

このチュートリアルでは、Ktorを使用してスタンドアロンサーバーアプリケーションを作成する方法について説明します。

2. Ktor Applicationのセットアップ

Ktorプロジェクトを設定することから始めましょう。 推奨される使いやすいアプローチであるGradleを使用します。 Gradleは、Gradle siteに記載されている手順に従ってインストールできます。

build.gradleファイルを作成します。

group 'com.example.kotlin'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.2.40'
    ext.ktor_version = '0.9.2'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'application'

mainClassName = 'APIServer.kt'

sourceCompatibility = 1.8
compileKotlin { kotlinOptions.jvmTarget = "1.8" }
compileTestKotlin { kotlinOptions.jvmTarget = "1.8" }

kotlin { experimental { coroutines "enable" } }

repositories {
    mavenCentral()
    jcenter()
    maven { url "https://dl.bintray.com/kotlin/ktor" }
}

dependencies {
    compile "io.ktor:ktor-server-netty:$ktor_version"
    compile "ch.qos.logback:logback-classic:1.2.1"
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

KtorとKtornettyサーバーパッケージをインポートしました。 Nettyは、この例で使用する組み込みサーバーです。

3. サーバーの構築

ソースフォルダsrc/main/kotlinにコードを追加してアプリケーションを作成します。

ここでは、mainメソッドを使用してファイルAPIServer.ktを作成します。

fun main(args: Array) {

}

次に、組み込みNettyサーバーを作成して起動します。

embeddedServer(Netty, 8080) {

}.start(wait = true)

ポート8080でサーバーを作成して起動します。 接続をリッスンするために、start()メソッドにwait=trueを設定しました。

4. APIの構築

APIを追加しましょう。 HTTPリクエストを処理するために、KtorはRouting機能を提供します。

特定のパスとHTTPメソッドのルートを定義できるinstallブロックを使用してRouting featureをアクティブ化します。

val jsonResponse = """{
    "id": 1,
    "task": "Pay waterbill",
    "description": "Pay water bill today",
}"""

embeddedServer(Netty, 8080) {
  install(Routing) {
      get("/todo") {
          call.respondText(jsonResponse, ContentType.Application.Json)
      }
  }
}.start(wait = true)

この例では、サーバーはパス/todoに対するGETリクエストを処理し、todo JSONオブジェクトで応答します。機能のインストールについてはセクション%で詳しく説明します。 (t4)s

5. サーバーの実行

サーバーを実行するには、Gradleで実行タスクが必要です。

task runServer(type: JavaExec) {
    main = 'APIServer'
    classpath = sourceSets.main.runtimeClasspath
}

サーバーを起動するには、次のタスクを呼び出します。

./gradlew runServer

その後、http://localhost:8080/todo.を介してOutAPIにアクセスできます。

6. 機能のインストール

Ktorアプリケーションは通常、一連の機能で構成されています。 機能は、要求および応答パイプラインに注入される機能と考えることができます。

DefaultHeaders機能を使用して、すべての送信応答にヘッダーを追加できます。 Routingは、リクエストなどを処理するためのルートを定義できるもう1つの機能です。

また、機能を開発してインストールすることもできます。

DefaultHeaders機能をインストールして、各リクエストにカスタムヘッダーを追加して見てみましょう。

install(DefaultHeaders) {
    header("X-Developer", "example")
}

同様に、Ktorフレームワーク自体によって設定されたデフォルトのヘッダーをオーバーライドできます。

install(DefaultHeaders) {
    header(HttpHeaders.Server, "My Server")
}

使用可能なデフォルトヘッダーのリストは、クラスio.ktor.features.DefaultHeaders. にあります。

7. JSONを提供する

文字列化されたJSONを手動で構築するのは簡単ではありません。 Ktorは、Gson.を使用してデータオブジェクトをJSONとして提供する機能を提供します

build.gradleにGson依存関係を追加しましょう:

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

たとえば、Author:という名前のデータオブジェクトを使用します

data class Author(val name: String, val website: String)

次に、gson機能をインストールします。

install(ContentNegotiation) {
   gson {
       setPrettyPrinting()
   }
}

最後に、作成者オブジェクトをJSONとして提供するサーバーへのルートを追加しましょう。

get("/author") {
    val author = Author("example", "example.com")
    call.respond(author)
}

作成者APIは、作成者データオブジェクトをJSONとして提供します。

8. コントローラーの追加

複数のHTTPアクションリクエストを処理する方法を理解するために、ユーザーがTODOアイテムを追加、削除、表示、一覧表示できるTODOアプリケーションを作成しましょう。

まず、Todoデータクラスを追加します。

data class ToDo(var id: Int, val name: String, val description: String, val completed: Boolean)

次に、複数のTodoアイテムを保持するためにArrayListを作成します。

val toDoList = ArrayList();

次に、POST、DELETE、およびGETリクエストを処理するコントローラーを追加します。

routing() {
    route("/todo") {
        post {
            var toDo = call.receive();
            toDo.id = toDoList.size;
            toDoList.add(toDo);
            call.respond("Added")

        }
        delete("/{id}") {
            call.respond(toDoList.removeAt(call.parameters["id"]!!.toInt()));
        }
        get("/{id}") {
            call.respond(toDoList[call.parameters["id"]!!.toInt()]);
        }
        get {
            call.respond(toDoList);
        }
    }
}

todorouteを追加してから、さまざまなHTTP動詞リクエストをそのエンドポイントにマッピングしました。

9. 結論

この記事では、Ktorフレームワークを使用してKotlinサーバーアプリケーションを作成する方法を学びました。

ボイラープレートコードを使用せずに、数分で小さなサーバーアプリケーションを構築しました。

いつものように、コードサンプルはover on GitHubで見つけることができます。