Знакомство с библиотекой http4k #
Васильев Андрей Михайлович, 2025
Версии презентации
Обзор библиотеки 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:6.1.0.1" - Поддерживается множество вариантов HTTP-библиотек: Apache, Fuel, Helidon, Jetty, OkHttp, WebSocket
 - Для подключения клиента Apache: 
"org.http4k:http4k-client-apache:6.1.0.1" 
Создание объекта клиента #
Библиотека 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