Маршруты и обработчики
Маршрут связывает HTTP-метод и адрес с кодом. Код, который выполняется по маршруту, называется обработчиком (handler). В Javalin обработчик — это объект интерфейса Handler с одним методом handle(Context ctx), поэтому чаще всего его записывают лямбдой ctx -> .... Все маршруты объявляются в блоке настроек через config.routes.
Маршруты для разных методов
Каждому HTTP-методу соответствует свой метод config.routes. Замените содержимое блока настроек в Main.java:
// src/main/java/com/example/blog/Main.java
Javalin app = Javalin.create(config -> {
config.routes.get("/posts", ctx -> ctx.result("Список постов"));
config.routes.post("/posts", ctx -> ctx.status(201).result("Пост создан"));
config.routes.put("/posts/{id}", ctx -> ctx.result("Пост обновлён"));
config.routes.delete("/posts/{id}", ctx -> ctx.status(204));
});Один адрес /posts отвечает по-разному на GET и POST. Часть адреса в фигурных скобках {id} — параметр, о нём следующий урок. Метод ctx.status задаёт код ответа: 201 значит «создано», 204 — «успешно, без тела».
Проверьте маршруты через curl. Ключ -X задаёт метод, ключ -i показывает строку статуса и заголовки (заголовки Date и Content-Length здесь и дальше опущены):
curl http://localhost:8080/posts
curl -i -X POST http://localhost:8080/postsСписок постов
HTTP/1.1 201 Created
Content-Type: text/plain
Пост создан
Что умеет ctx
Через ctx обработчик читает запрос и формирует ответ:
| Метод | Что делает |
|---|---|
ctx.method(), ctx.path() | Метод и путь запроса |
ctx.header("User-Agent") | Заголовок запроса |
ctx.result("текст") | Тело ответа строкой |
ctx.status(201) | Код ответа |
ctx.header("X-Blog", "Javalin") | Заголовок ответа |
// src/main/java/com/example/blog/Main.java
config.routes.get("/info", ctx -> {
ctx.header("X-Blog", "Javalin");
ctx.result(ctx.method() + " " + ctx.path() + " от " + ctx.userAgent());
});curl -i http://localhost:8080/infoHTTP/1.1 200 OK
Content-Type: text/plain
X-Blog: Javalin
GET /info от curl/8.21.0
Обработчик как метод
Длинный код удобнее вынести в метод с параметром Context и передать ссылкой:
// src/main/java/com/example/blog/Main.java
config.routes.get("/about", Main::about);
// в классе Main, рядом с методом main (import io.javalin.http.Context)
private static void about(Context ctx) {
ctx.result("Блог на Javalin");
}Запрос curl http://localhost:8080/about вернёт Блог на Javalin. Позже такие методы переедут в отдельный класс-контроллер.
Если маршрута нет
На адрес или метод без маршрута Javalin сам отвечает 404:
curl -i -X PATCH http://localhost:8080/posts/7HTTP/1.1 404 Not Found
Content-Type: text/plain
Endpoint PATCH /posts/7 not found
Частая ошибка
Javalin проверяет маршруты в порядке объявления. Если маршрут с параметром стоит выше конкретного адреса, он перехватывает и его:
// src/main/java/com/example/blog/Main.java
config.routes.get("/posts/{id}", ctx -> ctx.result("Пост №" + ctx.pathParam("id")));
config.routes.get("/posts/new", ctx -> ctx.result("Форма нового поста"));curl http://localhost:8080/posts/newПост №new
Объявляйте конкретные адреса вроде /posts/new выше маршрутов с параметрами.