Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Маршруты и обработчики

Маршрут связывает 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/info
HTTP/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/7
HTTP/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 выше маршрутов с параметрами.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.