Параметры пути и запроса
Клиент часто передаёт данные прямо в адресе. Параметр пути — часть самого адреса: в /posts/5 число 5 — номер поста. Параметр запроса (query parameter) — пара имя=значение после знака вопроса: /search?q=java&limit=5. Javalin даёт к ним доступ через ctx.
Параметр пути
В маршруте параметр записывается в фигурных скобках, а читается методом ctx.pathParam:
// src/main/java/com/example/blog/Main.java
config.routes.get("/posts/{id}", ctx -> {
String id = ctx.pathParam("id");
ctx.result("Пост №" + id);
});curl http://localhost:8080/posts/5Пост №5
pathParam всегда возвращает строку. Чтобы сразу получить число, используйте pathParamAsClass: он преобразует значение и проверяет его.
// src/main/java/com/example/blog/Main.java
config.routes.get("/users/{name}/posts/{id}", ctx -> {
String name = ctx.pathParam("name");
long id = ctx.pathParamAsClass("id", Long.class).get();
ctx.result(name + ", пост №" + id);
});Запрос curl http://localhost:8080/users/anna/posts/3 вернёт anna, пост №3. Если вместо числа придёт текст, Javalin сам ответит 400 с описанием в JSON:
curl -i http://localhost:8080/users/anna/posts/xHTTP/1.1 400 Bad Request
Content-Type: application/json
{"id":[{"message":"TYPE_CONVERSION_FAILED","args":{},"value":"x"}]}
Параметры запроса
Значения после ? читает ctx.queryParam. Если параметра нет, он возвращает null. Для чисел есть queryParamAsClass со значением по умолчанию:
// src/main/java/com/example/blog/Main.java
config.routes.get("/search", ctx -> {
String q = ctx.queryParam("q");
int limit = ctx.queryParamAsClass("limit", Integer.class).getOrDefault(10);
ctx.result("Поиск: " + q + ", лимит " + limit);
});curl "http://localhost:8080/search?q=java&limit=5"
curl http://localhost:8080/searchПоиск: java, лимит 5
Поиск: null, лимит 10
Адрес с ? и & берите в кавычки: иначе оболочка примет & за свой символ.
Справка по методам
| Метод | Результат для /search?tag=java&tag=web&limit=5 |
|---|---|
ctx.queryParam("limit") | "5" |
ctx.queryParams("tag") | список [java, web] |
ctx.queryParamAsClass("limit", Integer.class).get() | 5 |
ctx.queryParamAsClass("page", Integer.class).getOrDefault(1) | 1 |
ctx.queryParamMap() | все параметры словарём |
Частая ошибка
Имя в pathParam должно совпадать с именем в фигурных скобках маршрута. Опечатка не видна при компиляции:
// src/main/java/com/example/blog/Main.java
config.routes.get("/posts/{id}", ctx -> ctx.result("Пост №" + ctx.pathParam("postId")));Клиент получает 500 Server Error, а в логе сервера появляется причина:
WARN io.javalin.Javalin - Uncaught exception
java.lang.IllegalArgumentException: 'postId' is not a valid path-param for '/posts/{id}'.