Применение фильтров и линз в http4k

Применение фильтров и линз в http4k #

Используйте результаты предыдущей практической работы для решения задач данной практической работы.

Документация #

Использование линз для формирования HTML-документов #

В текущей ситуации приложение не оповещает своих клиентов о типе документов, которые возвращаются после обращения к маршрутам. Созданные HTML-документы должны иметь тип text/html.

  1. Создайте линзу на основе ранее созданного шаблонизатора. У линзы укажите тип данных ContentType TEXT_HTML.
  2. Передайте линзу вместо шаблонизатора в маршрутизатор, а из него в соответствующие обработчики маршрута.

После изменения приложения удостоверьтесь, что при возвращении HTML-документов им корректно устанавливается корректный тип данных.

Обработка ошибочных запросов #

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

  • Необходимо показывать пользователю HTML-документ, содержащий ошибочный запрос. На странице также должна присутствовать возможность вернуться к другим частям сайта.
  • Страницу необходимо показывать, если
    1. Статус ответа находится в рамках ошибочных ответов: клиентских ошибок, Status.clientError, и серверных ошибок, Status.serverError.
    2. В рамках ответа не установлен заголовок ContentType.

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

  1. Создайте страницу для отображения страницы в случае ошибочного запроса.
  2. Создайте фильтр для обработки ошибочных ответов согласно логике выше. Фильтр принимает в качестве аргумента обработчик HttpHandler и возвращает новый обработчик HttpHandler.
  3. Добавьте фильтр в цепочку по обработке запросов. Фильтр должен охватывать всю логику по обработке запросов.

Обработка параметров запроса #

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

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

Выполните данную задачу вручную и с использованием линз.

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

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

Обработка параметров формы добавления новых треугольников #

При работе с формой добавления треугольника форма должна:

  • Не терять данные, которые ввёл пользователь.
  • Показывать сообщения: почему форма не была принята сервером.
  • Принимать корректный ввод от пользователя.

Для реализации используйте линзы FormField и обёртку для линз, Body.webForm.

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

  1. Создайте отдельный пакет для хранения обработчиков, ru.ac.uniyar.handlers.
  2. Создайте файл для хранения обработчиков по работе с формой добавления треугольников, ru.ac.uniyar.handlers.NewTriangleForm.
  3. Перенесите в данный файл обработчики запросов
    • Обработчик GET-запроса на отображение формы, showNewTriangleForm.
    • Обработчик POST-запроса на добавление треугольника, createNewTriangle.
  4. Опишите линзы для обработки полей формы.
    • Для каждой из сторон треугольника создайте линзу на основе FormField.
    • Укажите тип данных для преобразования строки в число, int().
    • Укажите необходимость для показа информации, required(). В рамках вызова метода укажите название поля формы и описание.
    • Описание линз можно вынести вне функций-обработчика.
  5. Опишите общую линзу для обработки формы.
    • Объедините отдельные линзы для полей формы в единую линзу для всей формы с помощью Body.webForm.
    • В качестве валидатора формы используйте Validator.Feedback
  6. Преобразуйте модель шаблонизатора NewTriangleDataVM так, чтобы он принимал объект типа WebForm.
  7. В рамках обработчика запроса на показ формы, showNewTriangleForm, инициализируйте данную модель с помощью пустого объекта WebForm.
  8. В рамках обработчика запроса на добавление нового треугольника, createNewTriangle, реализуйте проверку параметров формы с помощью линзы всей формы.
    1. Обработайте запрос от пользователя с помощью линзы формы.
    2. Если в результате проверки формы в полученном объекте WebForm находятся ошибки, то необходимо показать пользователю HTML-документ с формой.
    3. Если в результате проверки формы нет ошибок, то необходимо создать новый объект Triangle, передав ему в конструктор параметры, полученные от пользователя.
  9. Модифицируйте шаблон отображения формы таким образом, чтобы он отображал данные из передаваемого объекта WebForm.
    1. Используйте свойство errors для отображения списка ошибок, которые были получены в результате проверки формы.
    2. Используйте свойство fields для отображения данных, которые были введены пользователем при отправке формы.

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