Kotlin Academy · Урок

Маршрутизация и типизированные параметры

Определяйте маршруты с параметрами пути и запроса и группируйте их блоками маршрутов.

Урок 2 из 413 шагов

«Маршрутизация и типизированные параметры» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Основы маршрутизации в Ktor

Маршрутизация в Ktor — это плагин, устанавливаемый через install(Routing) { ... } или сокращенную форму routing { ... }. Маршруты определяются с помощью функций для HTTP-методов: get, post, put, delete, patch.

routing {
    get("/hello") { call.respondText("Hello!") }
    post("/items") { /* handle POST */ }
}

Параметры пути

Определите параметр пути с помощью {name}. Получите его через call.parameters["name"]. Значение всегда имеет тип String?:

get("/users/{id}") {
    val id = call.parameters["id"] ?: return@get call.respondText("Missing id", status = HttpStatusCode.BadRequest)
    call.respondText("User: $id")
}

Необязательные сегменты пути

Сделайте сегмент необязательным, добавив ?: {name?}. Если сегмент отсутствует, call.parameters["name"] возвращает null.

get("/posts/{slug?}") {
    val slug = call.parameters["slug"]
    if (slug == null) call.respondText("All posts")
    else call.respondText("Post: $slug")
}

Преобразование параметров в типы

Преобразуйте параметры пути в значения нужных типов с помощью функций-расширений для Parameters. Ktor предоставляет встроенные вспомогательные функции, но можно написать собственные:

get("/items/{id}") {
    val id = call.parameters["id"]?.toLongOrNull()
        ?: return@get call.respond(HttpStatusCode.BadRequest, "Invalid id")
    call.respondText("Item #$id")
}

Параметры запроса

Получайте параметры строки запроса через call.request.queryParameters["key"]. Несколько значений одного ключа доступны через getAll("key"):

get("/search") {
    val q = call.request.queryParameters["q"] ?: ""
    val page = call.request.queryParameters["page"]?.toIntOrNull() ?: 1
    call.respondText("Search: $q, page $page")
}

Группировка маршрутов

Объединяйте связанные маршруты под общим префиксом с помощью route("/prefix") { ... }. Это уменьшает повторение и делает дерево маршрутизации понятным:

route("/api/v1") {
    route("/users") {
        get { /* list users */ }
        get("/{id}") { /* get user by id */ }
        post { /* create user */ }
    }
}

Организация маршрутов в функциях

Вынесите группы маршрутов в функции-расширения для Route, чтобы конфигурация маршрутизации оставалась модульной:

fun Route.userRoutes() {
    route("/users") {
        get { /* ... */ }
        post { /* ... */ }
        get("/{id}") { /* ... */ }
    }
}

// In Application module:
routing { userRoutes() }

Обработка тела запроса

Получите тело запроса в виде текста, байтов или десериализованного объекта (требуется плагин ContentNegotiation). Используйте call.receive() для типизированной десериализации:

post("/users") {
    val user = call.receive<UserDto>()
    call.respond(HttpStatusCode.Created, user)
}

Ответ с кодами состояния

Используйте call.respond(status, body) для полного контроля или удобные методы call.respondText(), call.respondFile(), call.respond(HttpStatusCode.NotFound):

get("/users/{id}") {
    val user = userRepo.find(call.parameters["id"])
    if (user == null) call.respond(HttpStatusCode.NotFound)
    else call.respond(user)
}

Маршруты с подстановочными знаками и хвостовыми параметрами

Используйте * для одного сегмента с подстановочным знаком, а {...} (хвостовую маску) — для сопоставления остальной части пути как одного параметра:

get("/static/{path...}") {
    val filePath = call.parameters.getAll("path")?.joinToString("/") ?: ""
    call.respondText("Serving: $filePath")
}

Приоритеты маршрутов

Ktor проверяет маршруты в порядке их объявления. Более специфичные маршруты следует объявлять перед маршрутами с подстановочными знаками. При совпадении двух маршрутов выбирается первое совпадение.

Быстрая проверка

Как сгруппировать несколько маршрутов под общим префиксом URL в Ktor?

Повторение: маршрутизация и типизированные параметры

Ключевые выводы:

  • Определяйте маршруты с помощью get, post и т. д. внутри routing { }
  • Параметры пути: {name} — доступ через call.parameters["name"]
  • Параметры запроса: call.request.queryParameters["key"]
  • Группируйте маршруты с помощью route("/prefix") { } и выносите их в функции-расширения для Route
  • Получайте типизированные тела с помощью call.receive() (требуется ContentNegotiation)
Можно начать бесплатно

Изучай Kotlin с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Маршрутизация и типизированные параметры» бесплатный?

Да — полный текст урока «Маршрутизация и типизированные параметры» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «Маршрутизация и типизированные параметры»?

Определяйте маршруты с параметрами пути и запроса и группируйте их блоками маршрутов. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Маршрутизация и типизированные параметры»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Настройка проекта Ktor: embeddedServer и модули приложения
  2. Маршрутизация и типизированные параметры
  3. Согласование содержимого и kotlinx.serialization
  4. Плагины аутентификации: JWT и сеансы
← Назад к Kotlin Academy