Применение линз для проверки данных от пользователя #
Документация #
- Использование линз в http4k
- Обработка форм с помощью линз
- Использование линз шалблонизаторов
- Использование фильтров
Особенности работ с линзами #
К сожалению базовый интерфейс линз не позволяет обработать некорректные значения, а также частично заполненные данные. Для решения подобных проблем можно воспользоваться следующими методами-обёртками. Они рассчитаны на использование с линзами, методом-строителем которых выступал
import org.http4k.lens.Lens
import org.http4k.lens.LensFailure
fun <IN : Any, OUT>lensOrNull(lens: Lens<IN, OUT?>, value: IN): OUT? =
try {
lens.invoke(value)
} catch (_: LensFailure) {
null
}
fun <IN : Any, OUT>lensOrDefault(lens: Lens<IN, OUT?>, value: IN, default: OUT): OUT =
try {
lens.invoke(value) ?: default
} catch (_: LensFailure) {
default
}
Вариант вызова данных функций-обёрток:
lensOrNull(fromLens, request)
Задача № 1. Использование линз для формирования HTML-документов #
В текущей ситуации приложение не оповещает своих клиентов о типе документов, которые возвращаются после обращения к маршрутам. Созданные HTML-документы должны иметь тип text/html
.
- Создайте линзу на основе ранее созданного шаблонизатора. У линзы укажите тип данных ContentType TEXT_HTML.
- Передайте линзу вместо шаблонизатора в маршрутизатор, а из него в соответствующие обработчики маршрута.
После изменения приложения удостоверьтесь, что при возвращении HTML-документов им корректно устанавливается корректный тип данных.
Задача № 2. Обработка параметров формы добавления новых треугольников #
При работе с формой добавления треугольника форма должна:
- Не терять данные, которые ввёл пользователь.
- Показывать сообщения: почему форма не была принята сервером.
- Принимать корректный ввод от пользователя.
Для реализации используйте линзы FormField и обёртку для линз, Body.webForm.
Подход к реализации
- Создайте отдельный пакет для хранения обработчиков,
ru.yarsu.handlers
. - Создайте файл для хранения обработчиков по работе с формой добавления треугольников,
src/main/kotlin/ru/yarsu/handlers/NewTriangleForm.kt
. - Перенесите в данный файл обработчики запросов
- Обработчик GET-запроса на отображение формы, функции-геренаторы обработчиков
showNewTriangleForm
. - Обработчик POST-запроса на добавление треугольника, функции генераторы-обработчиков
createNewTriangle
.
- Обработчик GET-запроса на отображение формы, функции-геренаторы обработчиков
- Опишите линзы для обработки полей формы.
- Для каждой из сторон треугольника создайте линзу на основе FormField.
- Укажите тип данных для преобразования строки в число, int().
- Укажите необходимость для показа информации, required(). В рамках вызова метода укажите название поля формы и описание.
- Описание линз можно вынести вне функций-обработчика.
- Опишите общую линзу для обработки формы.
- Объедините отдельные линзы для полей формы в единую линзу для всей формы с помощью Body.webForm.
- В качестве валидатора формы используйте Validator.Feedback
- Преобразуйте модель шаблонизатора
NewTriangleDataVM
так, чтобы он принимал объект типа WebForm. - В рамках обработчика запроса на показ формы,
showNewTriangleForm
, инициализируйте данную модель с помощью пустого объектаWebForm
. - В рамках обработчика запроса на добавление нового треугольника,
createNewTriangle
, реализуйте проверку параметров формы с помощью линзы всей формы.- Обработайте запрос от пользователя с помощью линзы формы.
- Если в результате проверки формы в полученном объекте WebForm находятся ошибки, то необходимо показать пользователю HTML-документ с формой.
- Если в результате проверки формы нет ошибок, то необходимо создать новый объект
Triangle
, передав ему в конструктор параметры, полученные от пользователя.
- Модифицируйте шаблон отображения формы таким образом, чтобы он отображал данные из передаваемого объекта WebForm.
- Используйте свойство
errors
для отображения списка ошибок, которые были получены в результате проверки формы. - Используйте свойство
fields
для отображения данных, которые были введены пользователем при отправке формы.
- Используйте свойство
Задача № 3. Обработка переменной пути #
В рамках процесса обработки запроса для отображения конкретного треугольника необходимо обработать номер треугольника, передающийся как переменная пути.
- Если в рамках переменной передано не-число, то обработчик должен возвращать код ошибки 400, BAD_REQUEST.
- Если по указанному числу невозможно найти запись о добавленном треугольнике, то обработчик должен возвращать код ошибки 400, BAD_REQUEST.
- Если удалось найти нужный треугольник, то вывести HTML-документ пользователю.
Подход к реализации с использованием линз.
- Создайте линзу для получения параметра пути с помощью Path.
- Укажите преобразование пути к целому числу, int().
- Укажите данный параметр обязательным, required().
- Примените линзу к запросу, полученному от пользователя
triangleNumberLens(request)
. - Добавьте обработку исключения LensFailure. В случае возникновения исключительной ситуации обработчик должен возвращать ответ с кодом 400, BAD_REQUEST.
Можете воспользоваться одной из функций-обёрток.