Обработка переменных пути #
Описание маршрутизатора и обработчика с переменной пути #
При описании маршрутов в маршрутизаторе http4k разработчик может указать переменную пути:
val triangleStorage = TriangleStorage()
val getTriangleByIdOperation = getTriangleByIdOperationImpl(triangleStorage)
val triangleHandler = TriangleHandler(getTriangleByIdOperation)
routes(
"/triangles/{id}" bind Method.GET to triangleHandler,
)Внутри обработчика можно получить доступ к переменной пути с помощью метода Request.path:
class TriangleHandler(
private val getTriangleByIdOperation: GetTriangleByIdOperation
) : HttpHandler {
override fun invoke(request: Request): Response {
val id: String? = request.path("id")
...
}
}- Данные приходят в строковом формате.
- Если пользователь не передал данные, то и обработчик не будет вызван.
Как работает функция Request.path
#
Рассмотрим реализацию функции Request.path:
fun Request.path(name: String): String? = when (this) {
is RoutedMessage ->
(xUriTemplate ?: throw IllegalStateException("Request was not routed, so no uri-template present"))
.extract(uri.path)[name]
else -> throw IllegalStateException("Request was not routed, so no uri-template present")
}Из реализации видно, что функция работает не с интерфейсом Request, а с
интерфейсом RoutedMessage. Единственный класс, который реализует данный
интерфейс внутри библиотеки http4k — это класс
RequestWithContext,
обладающий следующим конструктором:
constructor(delegate: Request, uriTemplate: UriTemplate)Таким образом внутрь HTTP-обработчика надо передавать объекты класса
RoutedRequest, соединяющие в себе оригинальный объект запроса и шаблон шаблон
стандартной подсистемы маршрутизации.
Описание шаблона пути происходит с помощью класса
UriTemplate,
который можно создать с помощью функции-конструктора UriTemplate.from.
Задание № 1. Расширение возможностей хранилища #
Для расширенного доступа к данным приложения добавьте следующие возможности в класс-хранилище треугольника:
- Получение треугольника по его уникальному идентификатору. В случае, если был
передан уникальный идентификатор, для которого не найден треугольник, то
функция должна вернуть
null. - Добавление треугольника. При добавлении треугольника ему должен устанавливаться уникальный идентификатор, который не используется другим треугольником.
Задание № 2. Реализация отображения конкретного треугольника #
Реализуйте отображение информации о конкретном треугольнике по пути
/v1/triangle/{triangle-id}. Если по указанному пути треугольник не был найден, то
обработчик должен возвращать сообщение со статусом 404, NOT_FOUND.
Ключевые части по решению задачи:
- Реализуйте HTTP-обработчик для отображения информации о треугольнике:
- Он должен принимать в качестве аргумента объекты генератора JSON и хранилища.
- Из запроса извлеките значение переменной пути
triangle-id, преобразуйте его к UUID. - Если данные не были переданы или они не содержат корректный UUID, то должен
быть возвращён ответ с кодом 400, BAD REQUEST, и следующим JSON-документом:
Тип документа тоже должен быть указан корректно.
{ "error": "Некорректный идентификатор треугольника. Для параметра triangle-id ожидается UUID, но получено значение «ЗНАЧЕНИЕ»" } - Вызовите функцию хранилища, передав ей полученный идентификатор треугольника.
- Если извлечь данные не удалось (функция вернула
null), то обработчик должен вернуть ответ с кодом 404, NOT FOUND, и следующим JSON-документом:{ "triangle-id": "f0dcea8c-7a56-4223-ae43-3c664b50a603", "error": "Треугольник не найден" } - При успешном получении треугольника с помощью функции верните ответ со
статусом 200, OK, и следующим JSON-документом:
{ "Id": "66ade672-2301-4408-9471-8a17aa883d65", "SideA": 1, "SideB": 2, "SideC": 3, "RegistrationDateTime": "2024-07-01T00:00:00.0", "BorderColor": "BLUE", "FillColor": "GREEN", "Description": "странные данные, это не треугольник", "Area": null, "Type": "некорректный" }
- Реализуйте модульные тесты на созданный HTTP-обработчик.
- Свяжите данный обработчик HTTP-запроса с маршрутом
/v1/triangle/{triangle-id}.
Задание № 3. Обработка отсутствия параметра #
Особенностью http4k является то, что запрос по маршруту /v1/triangle/ без
указания дополнительной информации, не будет передан связанному обработчику
HTTP-запроса.
Доработайте приложение таким образом, чтобы при обращении по маршруту
/v1/triangle/ приложение также возвращало ответ с кодом 400, BAD REQUEST, с
сообщением, соответствующем некорректному идентификатору треугольника.