Применение линз

Применение линз для проверки данных от пользователя #

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

Особенности работ с линзами #

К сожалению базовый интерфейс линз не позволяет обработать некорректные значения, а также частично заполненные данные. Для решения подобных проблем можно воспользоваться следующими методами-обёртками. Они рассчитаны на использование с линзами, методом-строителем которых выступал

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.

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

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

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

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

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

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

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

  1. Создайте отдельный пакет для хранения обработчиков, ru.yarsu.handlers.
  2. Создайте файл для хранения обработчиков по работе с формой добавления треугольников, src/main/kotlin/ru/yarsu/handlers/NewTriangleForm.kt.
  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 для отображения данных, которые были введены пользователем при отправке формы.

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

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

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

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

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

Можете воспользоваться одной из функций-обёрток.

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