В этом уроке мы познакомимся с обработчиками и выясним, как ими пользоваться.
Что такое обработчик
Главная содержательная часть в файле HelloWorld.java — это обработчик запроса ctx -> ctx.result("Hello World")
:
package org.example.hexlet;
import io.javalin.Javalin;
public class HelloWorld {
public static void main(String[] args) {
var app = Javalin.create(config -> {
config.bundledPlugins.enableDevLogging();
});
// Передаем обработчик запроса
app.get("/", ctx -> ctx.result("Hello World"));
app.start(7070);
}
}
На каждый адрес задается обработчик — это функция, которая подготавливает ответ по заданному адресу и возвращает его. Затем веб-сервер превращает этот ответ в HTTP-ответ и отправляет клиенту. В примере выше, обработчик отдает строку Hello World на запрос GET /
.
В Javalin все приложение представлено объектом класса Javalin
. Этот объект содержит методы, аналогичные методам HTTP:
get
post
put
и так далее
Эти методы принимают на вход два параметра:
- Сам обработчик
- Маршрут, для которого он вызовется
В простейшем случае обработчик — это лямбда, которая принимает на вход объект ctx
(context). Через этот объект идет чтение данных HTTP-запроса и формирование HTTP-ответа. В нашем примере мы установили тело ответа через метод ctx.result()
. Остальные параметры фреймворк установил по умолчанию — например, код ответа 200.
Во фреймворках принято считать, что маршрут — это комбинация метода HTTP и адреса. Другими словами, с точки зрения большинства фреймворков GET /users и POST /users — это разные маршруты со своими обработчиками.
Посмотрим, как это работает на практике. Определим соответствующие маршруты и выполним запросы к ним с помощью curl:
package org.example.hexlet;
import io.javalin.Javalin;
public class HelloWorld {
public static void main(String[] args) {
var app = Javalin.create(config -> {
config.bundledPlugins.enableDevLogging();
});
app.get("/users", ctx -> ctx.result("GET /users"));
app.post("/users", ctx -> ctx.result("POST /users"));
app.start(7070);
}
}
# После старта приложения
curl localhost:7070/users
GET /users
curl -X POST localhost:7070/users
POST /users
Таким способом можно добавлять любое количество обработчиков на любые адреса.
Что такое диспетчеризация
Когда приложение получает запрос, как оно понимает, какой обработчик нужно запускать? Эту задачу решает диспетчеризация запроса, реализованная внутри фреймворка. Упрощенно этот процесс выглядит так:
- Фреймворк анализирует параметры запроса и пытается сопоставить два маршрута — добавленный в объект
app
и полученный в запросе. Другими словами, он сравнивает комбинацию метода запроса и сам адрес. Этот процесс называется роутингом или маршрутизацией - Если во время роутинга фреймворк нашел соответствующий маршрут, тогда вызывается его обработчик. Далее ответ от обработчика отправляется обратно клиенту
- Если фреймворк не нашел нужный обработчик, то запускается обработчик по умолчанию, который возвращает ошибку 404
Самостоятельная работа
- Выполните все шаги из этого урока на своем компьютере
- Запустите приложение и откройте в браузере страницу /users
- Убедитесь, что на экране вывелся текст, переданный в метод
result()
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.