KtorlinとKtor
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]にあります。