1.概要

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

このチュートリアルでは、Ktorを使ってスタンドアロンサーバーアプリケーションを作成する方法を探ります。

2. Ktorアプリケーションを設定する

Ktorプロジェクトを設定することから始めましょう。私たちは

Gradle

を使うつもりです。 Gradleはhttps://gradle.org/install/[

Gradle

site]にある指示に従ってインストールすることができます。


build.gradle

ファイルを作成します。

group 'com.baeldung.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とKtor nettyサーバーパッケージをインポートしました。 Nettyは、この例で使用する組み込みサーバーです。

3.サーバーを構築する

ソースフォルダ

src/main/kotlin

にコードを追加してアプリケーションを作成します。

ここでは、mainメソッドを使って

APIServer.kt

ファイルを作成します。

fun main(args: Array<String>) {

}

次に、組み込み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 object


で応答します。

__機能のインストールの詳細については、「機能のインストール」のセクションをご覧ください。

5.サーバーを実行する

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

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

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

./gradlew runServer

アウトAPIは


http://localhost:8080/todo

.

を介してアクセスできます。

6.機能のインストール

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


DefaultHeaders

機能を使用して、すべての送信応答にヘッダーを追加できます。

Routing

はリクエストなどを扱うためのルートを定義することを可能にするもう一つの機能です

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


DefaultHeaders

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

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

同様に、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("baeldung", "baeldung.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<ToDo>();

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

routing() {
    route("/todo") {
        post {
            var toDo = call.receive<ToDo>();
            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);
        }
    }
}


todo


route

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

9.まとめ

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

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

いつものように、コードサンプルはhttps://github.com/eugenp/tutorials/tree/master/kotlin-libraries[over GitHub]にあります。