Знакомство с библиотекой http4k #
Васильев Андрей Михайлович, 2024
Версии презентации
Обзор библиотеки http4k #
http4k — это набор инструментов для создания серверных и клиентских HTTP-приложений
- Предоставляет функциональный интерфейс для решения задач
- Не реализует самостоятельно функции сервера и клиента, а использует промышленные технологии для реализации нужных функций
- Включает средства для решения следующих задач:
- Обработка HTTP-запросов
- Взаимодействие с помощью WebSocket
- Запуск с собственным сервером, без сервера, встраивается в Jakarta
- Реализация контрактов OpenApi 3 (Swagger)
- Работа со множеством шаблонизаторов
- Поддержка работы со множеством типов данных: JSON, XML, YAML
- Поддержка всех видов тестирования веб-приложений
Ключевые концепции http4k #
- Основано на базовых концепциях функциональных языков программирования
- Вся логика по обработке HTTP-запросов описывается одной функцией
- Не используются техники метапрограммирования для решения задач
- Минимальный объём зависимостей
- Поддержка разработки приложения через написание тестов без сложной инфраструктуры
- Быстрый запуск и остановка приложений
- Предоставляет средства строгой типизации для обработки HTTP-сообщений
- Поддержка контрактов: генерация документации OpenApi, логичное поведение «по умолчанию»
Ключевые типы http4k #
Библиотека http4k предоставляет набор функциональных типов, которые позволяют создавать, тестировать и разворачивать HTTP-приложения
HttpMessage #
Данная структура является неизменяемой и описывает запросы и ответы
- Неизменяемые структуры позволяют избегать множества ошибок
- Цепочка формирования структур позволяет отследить изменения в приложении
- Позволяет удобно тестировать логику работы приложения
Детали интерфейса HttpMessage #
Класс содержит следующие свойства
version
— версия протокола HTTPheaders
— список HTTP-заголовковbody
— тело сообщения
Класс предоставляет методы для установки
- Значения конкретного свойства
- Значений отдельных заголовков
Изменение свойства приводит путём создания нового объекта с нужным состоянием, объекты, реализующие этот интерфейс, являются классами данных Kotlin
Запросы и ответы #
Для представления этих элементов внутри приложения используются интерфейсы Request и Response, которые унаследованы от интерфейса HttpMessage
interface Request : HttpMessage #
Помимо свойств интерфейса HttpMessage предоставляет следующие свойства
method
— HTTP-метод запроса (GET, PUT, …)source
— сетевая информация об источнике запросаuri
— адрес документа в запросе
interface Response : HttpMessage #
Помимо свойств интерфейса HttpMessage предоставляет следующие свойства
status
— статус HTTP-ответа
Тип HttpHandler #
typealias HttpHandler = (Request) -> Response
Данный функциональный тип моделирует работу входящих и исходящих HTTP-запросов
- Сервер должен предоставить реализацию данного функционального интерфейса, т.е. реализовать логику по обработке запроса и формирования ответа
- Клиент должен выполнить сетевой запрос к удалённому серверу и получить ответ на поставленный запрос
Написание HTTP-клиента #
Подключение библиотеки #
- Библиотека http4k поставляется как набор связных между собой модулей
- Для работы клиента необходимо подключить 2 модуля: ядро и реализацию HTTP-клиента
- Ядро доступно как Maven-артефакт:
"org.http4k:http4k-core:5.32.0.0"
- Поддерживается множество вариантов HTTP-библиотек: Apache, Fuel, Helidon, Jetty, OkHttp, WebSocket
- Для подключения Apache:
"org.http4k:http4k-client-apache:5.32.0.0"
Создание объекта клиента #
Библиотека http4k предоставляет обвязку поверх множества существующих клиентов:
val client: HttpHandler = ApacheClient()
Выполнение запроса #
HTTP-клиенту необходимо передать объект запроса, включая следующую информацию:
- Тип HTTP-запроса, тип описывается перечислением
org.http4k.core.Method
- URI к которому необходимо подключиться
- Либо в виде строки
- Либо в виде объекта
org.http4k.core.Uri
val client = ApacheClient()
val request = Request(Method.GET, Uri.of("http://example.com"))
val response = client(request)
val status = response.status
val data = response.body