Перейти к основному содержимому

Ktor — первая программа

Разработчику Архитектору

Ktor — первая программа

Ktor — асинхронный фреймворк от JetBrains для backend и HTTP-клиентов. Построен на корутинах.

База языка: Первая программа на Kotlin. Экосистема: Экосистема Kotlin. Android: мобильный раздел.


Создание проекта

В start.ktor.io выберите:

  • Engine: Netty
  • Dependencies: Routing, Content Negotiation, kotlinx-serialization

Или вручную — build.gradle.kts:

plugins {
kotlin("jvm") version "1.9.24"
kotlin("plugin.serialization") version "1.9.24"
application
}

repositories { mavenCentral() }

dependencies {
implementation("io.ktor:ktor-server-core-jvm:2.3.12")
implementation("io.ktor:ktor-server-netty-jvm:2.3.12")
implementation("io.ktor:ktor-server-content-negotiation-jvm:2.3.12")
implementation("io.ktor:ktor-serialization-kotlinx-json-jvm:2.3.12")
implementation("ch.qos.logback:logback-classic:1.5.6")
}

application { mainClass.set("com.example.ApplicationKt") }

Application.kt

package com.example

import io.ktor.serialization.kotlinx.json.*
import io.ktor.server.application.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import io.ktor.server.request.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import kotlinx.serialization.Serializable

@Serializable
data class Note(val id: Int, val text: String)

@Serializable
data class NoteCreate(val text: String)

fun main() {
embeddedServer(Netty, port = 8080, module = Application::module).start(wait = true)
}

fun Application.module() {
install(ContentNegotiation) { json() }

val notes = mutableListOf<Note>()
var nextId = 1

routing {
get("/health") {
call.respond(mapOf("status" to "ok"))
}
get("/notes") {
call.respond(notes)
}
post("/notes") {
val body = call.receive<NoteCreate>()
val note = Note(nextId++, body.text)
notes += note
call.respond(note)
}
delete("/notes/{id}") {
val id = call.parameters["id"]?.toIntOrNull()
?: return@delete call.respondText("bad id", status = io.ktor.http.HttpStatusCode.BadRequest)
if (notes.removeIf { it.id == id }) {
call.respondText(status = io.ktor.http.HttpStatusCode.NoContent)
} else {
call.respondText("not found", status = io.ktor.http.HttpStatusCode.NotFound)
}
}
}
}
./gradlew run

Проверка

curl http://127.0.0.1:8080/health
curl http://127.0.0.1:8080/notes
curl -X POST http://127.0.0.1:8080/notes \
-H "Content-Type: application/json" \
-d '{"text":"Изучить Ktor"}'

Плагины (следующий шаг)

ПлагинНазначение
AuthenticationJWT, Basic
CORSбраузерные клиенты
StatusPagesединый обработчик ошибок
CallLoggingлог запросов

Альтернатива на JVM: Spring для Kotlin/Java.


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).