Знакомство с линзами в http4k

Знакомство с линзами в http4k #

Шаблон проектирования линза #

Презентацию по теме можно посмотреть по ссылке.

Видео-запись: Rutube

Линзы в http4k #

Презентацию по теме можно посмотреть по ссылке.

Видео-запись: Rutube

Задание № 1. Обработка переменной пути #

В рамках процесса обработки запроса для отображения конкретного треугольника необходимо обработать номер треугольника, передающийся как переменная пути.

  • Если в рамках переменной передано не-число, то обработчик должен возвращать код ошибки 400, BAD_REQUEST.
  • Если по указанному числу невозможно найти запись о добавленном треугольнике, то обработчик должен возвращать код ошибки 404, NOT FOUND.
  • Если удалось найти нужный треугольник, то вернуть ответ с кодом 200 и корректным JSON-документом.

Подход к реализации с использованием линз.

  1. Создайте линзу для получения параметра пути с помощью Path.
  2. Укажите преобразование пути к целому числу, int().
  3. Используйте терминатор of, в котором укажите название переменной пути.
  4. Примените линзу к запросу, полученному от пользователя triangleNumberLens(request).
  5. Добавьте обработку исключения LensFailure. В случае возникновения исключительной ситуации обработчик должен возвращать ответ с кодом 400, BAD_REQUEST.

Задание № 2. Обработка параметров формы добавления пользователя #

Для реализации линз к полям формы используйте базовый объект FormField, а линзу для получения данных с формы формируйте с помощью Body.webForm.

Подход к реализации

  1. Опишите линзы для обработки полей формы внутри обработчика HTTP-запроса на добавление пользователя.
    • Для каждого поля формы создайте линзу на основе FormField.
    • Укажите тип данных для извлечения непустой строки, nonBlankString().
    • Укажите, что данные поля являются необходимыми для заполнения формы, т.е. используйте терминатор required(). В рамках вызова метода укажите название поля формы и его описание.
    • Описание линз следует вынести вне кода функций-обработчика, т.к. их описание не зависит от данных, приходящих от пользователя. Данные линзы будут пытаться преобразовать любой ввод от пользователя к предустановленному формату.
  2. Опишите линзу для обработки формы.
    • Объедините отдельные линзы для полей формы в единую линзу для всей формы с помощью Body.webForm.
    • В качестве валидатора формы используйте Validator.Feedback. Данный валидатор соберёт все сообщения об ошибках в результирующий объект, а не выбросит исключение при несоответствии данных запросам линз.
  3. В рамках обработчика запроса на добавление нового пользователя реализуйте проверку параметров формы с помощью линзы для всей формы.
    1. Обработайте запрос от пользователя с помощью линзы формы.
    2. Если в результате проверки формы в полученном объекте WebForm находятся ошибки (список ошибок не пуст), то необходимо сформировать JSON-документ, который сообщит о проблемах в полях. Используйте мета-информацию в объектах-ошибках, чтобы определить: какое поле содержит ошибку.
    3. Если в результате проверки формы нет ошибок, то необходимо создать новый объект пользователя, записать его в хранилище и сообщить пользователю об успешном завершении операции.

Задание № 3. Использование линз для фильтрации #

Реализуйте получение данных из параметров запроса на получение списка треугольников, отфильтрованного по площади, с помощью линз. Поведение HTTP-обработчика не должно измениться, но количество кода по обработке параметра должно значительно уменьшиться.

Подход к реализации

  1. Для решения задачи потребуется создать 4 линзы для получения вещественных и целых чисел. Линзы следует определять вне кода обработчика HTTP-запроса.
    1. Воспользуйтесь базовым объектом-строителем org.http4k.lens.Query.
    2. Укажите способ преобразования строки от пользователя к целевому значению. double() позволит получить вещественное число, int() для получения целого числа.
    3. Выберите корректный терминатор для каждой линзы — обязательный параметр, необязательный параметр, параметр со значением по умолчанию.
  2. Внутри кода обработчика HTTP-запроса воспользуйтесь линзами для извлечения значений параметров URI-запроса. Учтите, что при передаче данных не в подходящем формате линзы будут выбрасывать исключение org.http4k.lens.LensFailure. При возникновении исключения необходимо вернуть соответствующий ответ пользователю.
  3. Рассмотрите возможность использования линз для получения параметров постраничного вывода в других обработчиках HTTP-запросов.

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