Оглавление
Javalin
Маленький и простой веб-фреймворк: маршруты, обработчики, JSON и REST API в нескольких строках.
1.Начало работы
2.Маршруты и данные
- Маршруты и обработчикиКак объявить маршруты для GET, POST, PUT и DELETE, что такое обработчик и контекст ctx.
- Параметры пути и запросаКак получить id из адреса через pathParam и значения после знака вопроса через queryParam.
- JSON на входе и выходеКак вернуть объекты Java в виде JSON через ctx.json и принять JSON из тела запроса через bodyAsClass.
- Коды ответа и ошибкиКак выбрать код ответа, бросить готовое исключение вроде NotFoundResponse и перехватить свои исключения через exception и error.
- Проверка данныхКак проверять тело запроса через bodyValidator и параметры через queryParamAsClass с правилами check.
- Обработчики before и afterКак выполнить общий код до и после каждого запроса: замер времени, заголовки, проверки для группы адресов.
3.Структура и страницы
- Контроллеры и apiBuilderКак вынести обработчики в класс-контроллер и сгруппировать маршруты через apiBuilder и path.
- Статические файлыКак отдавать HTML, CSS, картинки и скрипты из папки src/main/resources/public через config.staticFiles.
- HTML-шаблоныКак собрать HTML-страницу из данных через шаблонизатор Mustache и метод ctx.render.
- HTML-формыКак принять данные из HTML-формы через formParam, показать ошибки в шаблоне и перенаправить браузер после POST.
- Загрузка файловКак принять файл через uploadedFile, безопасно сохранить его на диск, ограничить размер и отдать обратно по ссылке.
4.База данных и доступ
- База данных через JDBCКак хранить посты в базе H2: DataSource, таблица, класс-репозиторий с запросами JDBC и подключение к контроллеру.
- Вход и ролиКак защитить маршруты ролями: RouteRole, проверка в beforeMatched, Basic-авторизация и ответы 401 и 403.
- CORS для фронтендаЗачем нужен CORS, как разрешить запросы с другого адреса через встроенный плагин и как проверить заголовки.
- Куки и сессииКак ставить и удалять куки через ctx.cookie, хранить данные входа в сессии через sessionAttribute и сделать вход и выход для страниц блога.
- Документация API: OpenAPI и Swagger UIКак описать маршруты аннотацией @OpenApi, получить спецификацию OpenAPI через плагин javalin-openapi и открыть её в Swagger UI.
5.Реальное время, тесты и сборка
- WebSocket: чат блогаКак открыть постоянное соединение с браузером через config.routes.ws и рассылать сообщения всем подключённым.
- SSE: уведомления о новых постахКак отправлять события браузеру по одному открытому HTTP-соединению через config.routes.sse и SseClient.
- Тесты с javalin-testtoolsКак проверить API автоматически: вынести создание приложения в метод, запустить его в тесте через JavalinTest и отправить запросы.
- Сборка в один jarКак собрать приложение со всеми зависимостями в один исполняемый jar-файл через maven-shade-plugin и запустить его на сервере.
- Настройки, логирование и асинхронностьКак читать настройки из переменных окружения, писать в лог каждый запрос через requestLogger, какие опции Javalin полезны на сервере и как работает ctx.future.