Использование контекста запроса http4k

Использование контекста запроса http4k #

Васильев Андрей Михайлович, 2025

Версии презентации


Извлечение роли в запросе #

Ввиду того, что определение роли необходимо:

  • Выполнять при каждом запросе
  • Проверять на всех уровнях приложения

Удобно реализовать эту логику на уровне фильтра http-запроса:

diagram

  • На этапе обработки 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-обработчика извлечь необходимые данные и передать их как и другие параметры внутрь операции

Передавать объект запроса целиком считается плохой практикой

© A. M. Васильев, 2025, CC BY-SA 4.0, andrey@crafted.su