Routing i typowane parametry
Definiuj trasy z parametrami ścieżki i zapytania oraz grupuj je w blokach route.
Routing i typowane parametry to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Podstawy routingu w Ktor
Routing w Ktorze jest wtyczką instalowaną za pomocą install(Routing) { ... } lub skróconej formy routing { ... }. Trasy definiuje się za pomocą funkcji odpowiadających metodom HTTP: get, post, put, delete, patch.
routing {
get("/hello") { call.respondText("Hello!") }
post("/items") { /* handle POST */ }
}Parametry ścieżki
Parametr ścieżki należy zdefiniować za pomocą {name}. Dostęp do niego uzyskuje się przez call.parameters["name"]. Jego wartość zawsze ma typ String?:
get("/users/{id}") {
val id = call.parameters["id"] ?: return@get call.respondText("Missing id", status = HttpStatusCode.BadRequest)
call.respondText("User: $id")
}Opcjonalne segmenty ścieżki
Segment można oznaczyć jako opcjonalny, dodając ?: {name?}. Jeśli segmentu nie ma, call.parameters["name"] zwraca null.
get("/posts/{slug?}") {
val slug = call.parameters["slug"]
if (slug == null) call.respondText("All posts")
else call.respondText("Post: $slug")
}Konwersja parametrów do określonych typów
Parametry ścieżki należy konwertować na wartości określonych typów za pomocą funkcji rozszerzających dla Parameters. Ktor udostępnia wbudowane funkcje pomocnicze, można też napisać własne:
get("/items/{id}") {
val id = call.parameters["id"]?.toLongOrNull()
?: return@get call.respond(HttpStatusCode.BadRequest, "Invalid id")
call.respondText("Item #$id")
}Parametry zapytania
Do parametrów ciągu zapytania można uzyskać dostęp za pomocą call.request.queryParameters["key"]. Wiele wartości tego samego klucza jest dostępnych przez getAll("key"):
get("/search") {
val q = call.request.queryParameters["q"] ?: ""
val page = call.request.queryParameters["page"]?.toIntOrNull() ?: 1
call.respondText("Search: $q, page $page")
}Grupowanie tras
Powiązane trasy należy grupować pod wspólnym prefiksem za pomocą route("/prefix") { ... }. Ogranicza to powtórzenia i zwiększa czytelność drzewa routingu:
route("/api/v1") {
route("/users") {
get { /* list users */ }
get("/{id}") { /* get user by id */ }
post { /* create user */ }
}
}Organizowanie tras w funkcjach
Aby zachować modularność konfiguracji routingu, grupy tras należy wyodrębniać do funkcji rozszerzających dla Route:
fun Route.userRoutes() {
route("/users") {
get { /* ... */ }
post { /* ... */ }
get("/{id}") { /* ... */ }
}
}
// In Application module:
routing { userRoutes() }Obsługa treści żądania
Treść żądania można odbierać jako tekst, bajty lub zdeserializowany obiekt (wymaga to wtyczki ContentNegotiation). Do deserializacji z zachowaniem typów należy użyć call.receive<T>():
post("/users") {
val user = call.receive<UserDto>()
call.respond(HttpStatusCode.Created, user)
}Odpowiadanie kodami statusu
Do uzyskania pełnej kontroli należy użyć call.respond(status, body) albo metod pomocniczych 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)
}Trasy z symbolami wieloznacznymi i tailcard
Należy użyć * dla pojedynczego segmentu wieloznacznego oraz {...} (tailcard), aby dopasować resztę ścieżki jako pojedynczy parametr:
get("/static/{path...}") {
val filePath = call.parameters.getAll("path")?.joinToString("/") ?: ""
call.respondText("Serving: $filePath")
}Priorytety tras
Ktor ocenia trasy w kolejności ich deklaracji. Bardziej szczegółowe trasy należy deklarować przed trasami wieloznacznymi. Gdy pasują dwie trasy, wygrywa pierwsze dopasowanie.
Szybkie sprawdzenie
Jak grupuje się wiele tras pod wspólnym prefiksem adresu URL w Ktor?
Podsumowanie: Routing i parametry określonych typów
Najważniejsze informacje:
- Trasy należy definiować za pomocą
get,postitd. wewnątrzrouting { } - Parametry ścieżki:
{name}— dostęp przezcall.parameters["name"] - Parametry zapytania:
call.request.queryParameters["key"] - Trasy należy grupować za pomocą
route("/prefix") { }i wyodrębniać do funkcji rozszerzających dlaRoute - Treści z zachowaniem typów należy odbierać za pomocą
call.receive<T>()(wymaga ContentNegotiation)
Często zadawane pytania
Czy lekcja „Routing i typowane parametry” jest bezpłatna?
Tak — pełny tekst „Routing i typowane parametry” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Routing i typowane parametry”?
Definiuj trasy z parametrami ścieżki i zapytania oraz grupuj je w blokach route. Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?
Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Routing i typowane parametry”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?
Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Konfiguracja projektu Ktor: embeddedServer i moduły Application
- Routing i typowane parametry
- Negocjowanie treści i kotlinx.serialization
- Wtyczki uwierzytelniania: JWT i sesje