Маршрутизация и типизированные параметры
Определяйте маршруты с параметрами пути и запроса и группируйте их блоками маршрутов.
«Маршрутизация и типизированные параметры» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Настройка проекта Ktor: embeddedServer и модули приложения
- Маршрутизация и типизированные параметры
- Согласование содержимого и kotlinx.serialization
- Плагины аутентификации: JWT и сеансы