Применение фильтров и линз в http4k #
Используйте результаты предыдущей практической работы для решения задач данной практической работы.
Документация #
- Использование линз в http4k
- Обработка форм с помощью линз
- Использование линз шалблонизаторов
- Использование фильтров
Использование линз для формирования HTML-документов #
В текущей ситуации приложение не оповещает своих клиентов о типе документов, которые возвращаются после обращения к маршрутам. Созданные HTML-документы должны иметь тип text/html
.
- Создайте линзу на основе ранее созданного шаблонизатора. У линзы укажите тип данных ContentType TEXT_HTML.
- Передайте линзу вместо шаблонизатора в маршрутизатор, а из него в соответствующие обработчики маршрута.
После изменения приложения удостоверьтесь, что при возвращении HTML-документов им корректно устанавливается корректный тип данных.
Обработка ошибочных запросов #
Сформируйте фильтр для обработки ошибочных ответов на запросы пользователя. По умолчанию необходимо реализовать следующую схему.
- Необходимо показывать пользователю HTML-документ, содержащий ошибочный запрос. На странице также должна присутствовать возможность вернуться к другим частям сайта.
- Страницу необходимо показывать, если
- Статус ответа находится в рамках ошибочных ответов: клиентских ошибок, Status.clientError, и серверных ошибок, Status.serverError.
- В рамках ответа не установлен заголовок
ContentType
.
Подход к реализации
- Создайте страницу для отображения страницы в случае ошибочного запроса.
- Создайте фильтр для обработки ошибочных ответов согласно логике выше. Фильтр принимает в качестве аргумента обработчик HttpHandler и возвращает новый обработчик HttpHandler.
- Добавьте фильтр в цепочку по обработке запросов. Фильтр должен охватывать всю логику по обработке запросов.
Обработка параметров запроса #
В рамках процесса обработки запроса для отображения конкретного треугольника необходимо обработать переменную, приходящую из маршрута.
- Если в рамках переменной передано не-число, то обработчик должен возвращать код ошибки 400, BAD_REQUEST.
- Если по указанному числу невозможно найти запись о добавленном треугольнике, то обработчик должен возвращать код ошибки 400, BAD_REQUEST.
- Если удалось найти нужный треугольник, то вывести HTML-документ пользователю.
Выполните данную задачу вручную и с использованием линз.
Подход к реализации с использованием линз.
- Создайте линзу для получения параметра пути с помощью Path.
- Укажите преобразование пути к целому числу, int().
- Укажите данный параметр обязательным, required().
- Примените линзу к запросу, полученному от пользователя
triangleNumberLens(request)
. - Добавьте обработку исключения LensFailure. В случае возникновения исключительной ситуации обработчик должен возвращать ответ с кодом 400, BAD_REQUEST.
Обработка параметров формы добавления новых треугольников #
При работе с формой добавления треугольника форма должна:
- Не терять данные, которые ввёл пользователь.
- Показывать сообщения: почему форма не была принята сервером.
- Принимать корректный ввод от пользователя.
Для реализации используйте линзы FormField и обёртку для линз, Body.webForm.
Подход к реализации
- Создайте отдельный пакет для хранения обработчиков,
ru.ac.uniyar.handlers
. - Создайте файл для хранения обработчиков по работе с формой добавления треугольников,
ru.ac.uniyar.handlers.NewTriangleForm
. - Перенесите в данный файл обработчики запросов
- Обработчик GET-запроса на отображение формы,
showNewTriangleForm
. - Обработчик POST-запроса на добавление треугольника,
createNewTriangle
.
- Обработчик GET-запроса на отображение формы,
- Опишите линзы для обработки полей формы.
- Для каждой из сторон треугольника создайте линзу на основе FormField.
- Укажите тип данных для преобразования строки в число, int().
- Укажите необходимость для показа информации, required(). В рамках вызова метода укажите название поля формы и описание.
- Описание линз можно вынести вне функций-обработчика.
- Опишите общую линзу для обработки формы.
- Объедините отдельные линзы для полей формы в единую линзу для всей формы с помощью Body.webForm.
- В качестве валидатора формы используйте Validator.Feedback
- Преобразуйте модель шаблонизатора
NewTriangleDataVM
так, чтобы он принимал объект типа WebForm. - В рамках обработчика запроса на показ формы,
showNewTriangleForm
, инициализируйте данную модель с помощью пустого объектаWebForm
. - В рамках обработчика запроса на добавление нового треугольника,
createNewTriangle
, реализуйте проверку параметров формы с помощью линзы всей формы.- Обработайте запрос от пользователя с помощью линзы формы.
- Если в результате проверки формы в полученном объекте WebForm находятся ошибки, то необходимо показать пользователю HTML-документ с формой.
- Если в результате проверки формы нет ошибок, то необходимо создать новый объект
Triangle
, передав ему в конструктор параметры, полученные от пользователя.
- Модифицируйте шаблон отображения формы таким образом, чтобы он отображал данные из передаваемого объекта WebForm.
- Используйте свойство
errors
для отображения списка ошибок, которые были получены в результате проверки формы. - Используйте свойство
fields
для отображения данных, которые были введены пользователем при отправке формы.
- Используйте свойство