Знакомство с линзами в http4k #
Шаблон проектирования линза #
Презентацию по теме можно посмотреть по ссылке.
Видео-запись: Rutube
Линзы в http4k #
Презентацию по теме можно посмотреть по ссылке.
Видео-запись: Rutube
Задание № 1. Обработка переменной пути #
В рамках процесса обработки запроса для отображения конкретного треугольника необходимо обработать номер треугольника, передающийся как переменная пути.
- Если в рамках переменной передано не-число, то обработчик должен возвращать код ошибки 400, BAD_REQUEST.
- Если по указанному числу невозможно найти запись о добавленном треугольнике, то обработчик должен возвращать код ошибки 404, NOT FOUND.
- Если удалось найти нужный треугольник, то вернуть ответ с кодом 200 и корректным JSON-документом.
Подход к реализации с использованием линз.
- Создайте линзу для получения параметра пути с помощью Path.
- Укажите преобразование пути к целому числу, int().
- Используйте терминатор
of
, в котором укажите название переменной пути. - Примените линзу к запросу, полученному от пользователя
triangleNumberLens(request)
. - Добавьте обработку исключения LensFailure. В случае возникновения исключительной ситуации обработчик должен возвращать ответ с кодом 400, BAD_REQUEST.
Задание № 2. Обработка параметров формы добавления пользователя #
Для реализации линз к полям формы используйте базовый объект FormField, а линзу для получения данных с формы формируйте с помощью Body.webForm.
Подход к реализации
- Опишите линзы для обработки полей формы внутри обработчика HTTP-запроса на
добавление пользователя.
- Для каждого поля формы создайте линзу на основе FormField.
- Укажите тип данных для извлечения непустой строки,
nonBlankString()
. - Укажите, что данные поля являются необходимыми для заполнения формы, т.е. используйте терминатор required(). В рамках вызова метода укажите название поля формы и его описание.
- Описание линз следует вынести вне кода функций-обработчика, т.к. их описание не зависит от данных, приходящих от пользователя. Данные линзы будут пытаться преобразовать любой ввод от пользователя к предустановленному формату.
- Опишите линзу для обработки формы.
- Объедините отдельные линзы для полей формы в единую линзу для всей формы с помощью Body.webForm.
- В качестве валидатора формы используйте Validator.Feedback. Данный валидатор соберёт все сообщения об ошибках в результирующий объект, а не выбросит исключение при несоответствии данных запросам линз.
- В рамках обработчика запроса на добавление нового пользователя реализуйте
проверку параметров формы с помощью линзы для всей формы.
- Обработайте запрос от пользователя с помощью линзы формы.
- Если в результате проверки формы в полученном объекте WebForm находятся ошибки (список ошибок не пуст), то необходимо сформировать JSON-документ, который сообщит о проблемах в полях. Используйте мета-информацию в объектах-ошибках, чтобы определить: какое поле содержит ошибку.
- Если в результате проверки формы нет ошибок, то необходимо создать новый объект пользователя, записать его в хранилище и сообщить пользователю об успешном завершении операции.
Задание № 3. Использование линз для фильтрации #
Реализуйте получение данных из параметров запроса на получение списка треугольников, отфильтрованного по площади, с помощью линз. Поведение HTTP-обработчика не должно измениться, но количество кода по обработке параметра должно значительно уменьшиться.
Подход к реализации
- Для решения задачи потребуется создать 4 линзы для получения вещественных и
целых чисел. Линзы следует определять вне кода обработчика HTTP-запроса.
- Воспользуйтесь базовым объектом-строителем org.http4k.lens.Query.
- Укажите способ преобразования строки от пользователя к целевому значению. double() позволит получить вещественное число, int() для получения целого числа.
- Выберите корректный терминатор для каждой линзы — обязательный параметр, необязательный параметр, параметр со значением по умолчанию.
- Внутри кода обработчика HTTP-запроса воспользуйтесь линзами для извлечения значений параметров URI-запроса. Учтите, что при передаче данных не в подходящем формате линзы будут выбрасывать исключение org.http4k.lens.LensFailure. При возникновении исключения необходимо вернуть соответствующий ответ пользователю.
- Рассмотрите возможность использования линз для получения параметров постраничного вывода в других обработчиках HTTP-запросов.