Использование контекста запроса http4k #
Васильев Андрей Михайлович, 2025
Версии презентации
Извлечение роли в запросе #
Ввиду того, что определение роли необходимо:
- Выполнять при каждом запросе
- Проверять на всех уровнях приложения
Удобно реализовать эту логику на уровне фильтра http-запроса:
- На этапе обработки JWT-токена можно получить уникальный идентификатор пользователя
- На этапе определения роли по полученному идентификатору можно определить роль пользователя
- На уровне обработчика HTTP-запроса можно учесть фактор владения данными
Передача данных из фильтра #
Базовый интерфейс фильтров в http4k передаёт данные внутреннему HTTP-обработчику только в формате объекта Request, передача дополнительных данных через этот интерфейс не предусмотрена
- Передавать данные строками через Request
- Придумывать своё собственное дополнительное хранилище
- Воспользоваться контектом запроса в http4k
Рассмотрим последний вариант
Хранение контекстных данных #
- http4k предоставляет возможность добавить и извлечь контекстные данные из объекта типа Request, что позволяет передавать данные между слоями приложения
- Доступ к данным осуществляется через линзу
org.http4k.lens.RequestKey
val requestKey = RequestKey.required<SharedData>("sharedData")
- Данные в хранилище типизированы, в примере данные описываются SharedData
- Для данных в хранилище надо указать уникальный строковый идентификатор
Работа с контекстными данными #
val requestKey = RequestKey.required<SharedData>("sharedData")
val sharedData: SharedData = ...
val request: Request = ...
val newReqestOne = request.with(request of sharedData) // Запись с with
val newReqestTwo = sharedData(sharedData, request) // Прямое API линзы
val extractedData = sharedData(newRequestOne) // Извлечение данных
- Линза для доступа к контексту описывается в отдельном файле
- Линза используется для записи данных и для чтения данных
- Запись данных в Request обычно производится на уровне фильтра
- Чтение данных производится на вложенных фильтрах и обработчиках HTTP-запроса
Доступ к контексту на уровне операции #
Для обработки запроса может потребоваться выполнить решение о возможности выполнения операции на уровне операции
- Выяснить является ли пользователь из запроса владельцем этих данных
- Сформировать персонализированные данные для пользователя
Для решения этой задачи необходимо на уровне HTTP-обработчика извлечь необходимые данные и передать их как и другие параметры внутрь операции
Передавать объект запроса целиком считается плохой практикой