Знакомство с библиотекой http4k

Знакомство с библиотекой http4k #

Васильев Андрей Михайлович, 2024

Версии презентации


Обзор библиотеки http4k #

http4k — это набор инструментов для создания серверных и клиентских HTTP-приложений

  • Предоставляет функциональный интерфейс для решения задач
  • Не реализует самостоятельно функции сервера и клиента, а использует промышленные технологии для реализации нужных функций
  • Включает средства для решения следующих задач:
    • Обработка HTTP-запросов
    • Взаимодействие с помощью WebSocket
    • Запуск с собственным сервером, без сервера, встраивается в Jakarta
    • Реализация контрактов OpenApi 3 (Swagger)
    • Работа со множеством шаблонизаторов
    • Поддержка работы со множеством типов данных: JSON, XML, YAML
    • Поддержка всех видов тестирования веб-приложений

Ключевые концепции http4k #

  • Основано на базовых концепциях функциональных языков программирования
  • Вся логика по обработке HTTP-запросов описывается одной функцией
  • Не используются техники метапрограммирования для решения задач
  • Минимальный объём зависимостей
  • Поддержка разработки приложения через написание тестов без сложной инфраструктуры
  • Быстрый запуск и остановка приложений
  • Предоставляет средства строгой типизации для обработки HTTP-сообщений
  • Поддержка контрактов: генерация документации OpenApi, логичное поведение «по умолчанию»

Ключевые типы http4k #

Библиотека http4k предоставляет набор функциональных типов, которые позволяют создавать, тестировать и разворачивать HTTP-приложения

HttpMessage #

Данная структура является неизменяемой и описывает запросы и ответы

  • Неизменяемые структуры позволяют избегать множества ошибок
  • Цепочка формирования структур позволяет отследить изменения в приложении
  • Позволяет удобно тестировать логику работы приложения

Детали интерфейса HttpMessage #

diagram

Класс содержит следующие свойства

  • version — версия протокола HTTP
  • headers — список 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

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