Написание простых приложений на http4k

Написание простых приложений на http4k #

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

Задачи #

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

  • Добавлены CSS-файлы Zurb Foundaiton.
  • Добавлена базовая раскладка layout.peb, подключающая CSS-файлы Foundation.
  • Добавлена раздача статических файлов из каталога ресурсов проекта (решение не для продуктового использования).
  • Из маршрутизатора http4k вынесены функции-генераторы обработчиков HTTP-запросов.
  • Создание шаблонизатора перенесено в стартовую функцию main.

Проанализируйте как устроены функции-генераторы обработчиков HTTP-запросов.

Отображение информации о треугольнике #

Добавьте отображение информации о треугольнике (длины сторон, периметр, площадь) при переходе по маршруту /triangle/show.

Примерный план реализации:

  1. Создайте модель ru.yarsu.models.TriangleVM с необходимыми данными для отображения. Все параметры модели — вещественные числа.
  2. Унаследуйте созданный класс от org.http4k.template.ViewModel.
  3. Создайте шаблон для отображения модели в файле src/main/resources/ru/yarsu/models/TriangleVM.peb.
  4. Реализуйте отображение данных модели на странице. Рекомендуется использовать отдельные параграфы для каждого параметра.
  5. Добавьте обработчик для данного запроса.
    1. В файле WebApplicaiton.kt создайте функцию showTriangle.
    2. Данная функция должна возвращать обработчик запроса, HttpHandler. Функция должна принимать в качестве аргумента шаблонизатор, renderer: TemplateRenderer.
    3. Внутри обработчика создайте экземпляр класса TriangleVM с заполненными данными. Длины сторон: 3.0, 4.0, 5.0. Периметр: 12.0. Площадь: 6.0.
    4. Для формирования тела ответа используйте вызов шаблонизатора на экземпляре класса TriangleVM.
  6. Свяжите обработчик запроса с маршрутом /triangle/show внутри функции по формированию маршрутизатора router. Связывание производите для GET-запроса.
  7. Перезапустите приложение.
  8. Откройте в браузере ссылку http://localhost:9000/triangle/show и убедитесь, что информация о треугольнике отображается на полученной странице.

Описание модели данных для отображения #

Сформируйте классы для описания треугольника и списка треугольников. Данные классы опишут предметную область, для которой реализуется приложение.

  1. Создайте класс для хранения данных об отдельном треугольнике ru.yarsu.domain.Triangle.
    1. Данными класса являются неизменяемые длины сторон треугольника, вещественные числа, а также порядковый номер треугольника в списке, целое число.
    2. Класс должен предоставлять методы для вычисления свойств треугольника: периметра и площади.
    3. В качестве основы рекомендуется использовать класс данных, чтобы можно было воспользоваться функцией копирования.
  2. Создайте класс для хранения списка треугольников ru.yarsu.domain.Triangles.
    1. Класс должен хранить изменяемый список треугольников val triangles = mutableListOf<Trinagle>(). Изначальное состояние может быть передано в конструктор класса.
    2. Класс должен позволять добавлять треугольники в список fun add(triangle: Triangle). При добавлении нового элемента класс должен проверять, что его порядковый номер уникален. Самый простой способ — при добавлении нового элемента устанавливать в качестве порядкового номера текущий размер количества элементов.
    3. Класс должен позволять получать ссылку на последний треугольник в списке fun fetchOne(): Triangle.
    4. Класс должен позволять получать список треугольников, отсортированный по увеличению порядкового номера: fun fetchAllTriangles(): List<Triangle>.
    5. Класс должен предоставлять метод для получения треугольника по его порядковому номеру: fun fetchTriangleByNumber(number: Int): Triangle.
  3. Создайте экземпляр класса ru.yarsu.domain.Triangles внутри функции main. При создании списка треугольников добавьте минимум три экземпляра класса Triangle.

Отображение списка треугольников #

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

Маршрут для отображения списка/triangle/. Маршрут для отображения элемента списка /triangle/{number}, где number — это порядковый номер в списке треугольников.

Примерный план реализации:

  1. Создайте модель для отображения списка треугольников, ru.yarsu.models.TrianlesListVM. Данная модель должна содержать ссылку на список по элементам массива triangles: List<Triangle>.
  2. Создайте Pebble-шаблон для отображения модели в файле src/main/resources/ru/yarsu/models/TrianlesListVM.peb. Для каждого треугольника отобразите его порядковый номер, периметр и ссылку на страницу с детальной информацией. Можно воспользоваться либо таблицей, либо списком из карточек.
  3. Создайте функцию по созданию обработчика для отображения списка треугольников.
    1. В файле WebApplication.kt создайте функцию showTriangeList.
    2. Данная функция должна возвращать обработчик HTTP-запроса, HttpHandler. Функция должна принимать в качестве аргумента шаблонизатор, renderer, и ссылку на объект класса Triangles.
    3. Внутри обработчика создайте экземпляр класса TrianlesListVM, передав ей необходимые параметры.
    4. Для формирования тела ответа используйте вызов шаблонизатора на экземпляре класса TrianglesListVM.
  4. Модифицируйте функцию по созданию маршрутизатора таким образом, чтобы она получала ссылку на объект класса triangle: Triangles. Передайте данную ссылку внутри функции main.
  5. Свяжите созданный обработчик запроса с маршрутом /triangle внутри функции по формированию маршрутизатора router. Передайте данному обработчику необходимые данные для работы.
  6. Создайте модель для отображения конкретного треугольника, ru.yarsu.models.TriangleVM. Данная модель должна содержать ссылку на объект типа Triangle.
  7. Создайте Pebble-шаблон для отображения детальной информации о треугольнике: длин сторон, периметра и площади. На странице также должна быть ссылка на страницу со списком треугольников.
  8. Создайте функцию по созданию обработчика для отображения детальной информации о треугольнике.
    1. В файле WebApplication.kt создайте функцию showTriangle.
    2. Данная функция должна возвращать обработчик HTTP-запроса, HttpHandler. Функция должна принимать в качестве аргумента шаблонизатор, renderer, и ссылку на объект класса Triangles.
    3. Внутри HTTP-обработчика необходимо получить номер треугольника из переменной запроса number. Для извлечения значения данной переменной из пути используйте функцию Request.path.
    4. Преобразуйте полученную строку к числу с использованием функции toInt(). На настоящий момент будем подразумевать, что передаваемые данные корректны.
    5. Получите экземпляр класса Triangle от объекта Triangles по переданному порядковому номеру. Используйте соответствующий метод класса Triangles.
    6. Используйте полученную ссылку для заполнения модели TriangleVM. Используйте шаблонизатор и созданную модель для формирования тела ответа.
  9. Свяжите созданный HTTP-обработчик с маршрутом /triangle/{number} внутри функции по формированию маршрутизатора, router. Передайте функции по созданию обработчику ссылки на объект Triangles и Pebble-шаблонизатора.

Перенаправление на страницу со списком треугольников #

Добавьте обработку корневого маршрута /. При обращении к нему клиент должен переходить на страницу с отображением списка треугольников.

Примерный план реализации:

  1. Создайте обработчик корневого маршрута, функцию redirectToTriangleList в файле WebApplication.kt.
  2. Данная функция должна возвращать обработчик запроса, HttpHandler. Функция не принимает никаких аргументов.
  3. Внутри обработчика запроса необходимо вернуть ответ со статусом FOUND и заголовком Location со значением /triangle.
  4. Свяжите данный обработчик с маршрутом / и GET-запросом внутри функции по созданию маршрутиатора router.
  5. Убедитесь, что после открытия ссылки приложения, http://localhost:9000/, происходит переход к списку треугольников.

Обработка ошибочного параметра #

Доработайте обработчик маршрута /triangle/{number} таким образом, чтобы приложение вело себя корректно в следующих ситуациях:

  1. Переданный аргумент не содержит целого числа.
  2. Передан некорректный номер треугольника в списке.

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

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