Статьи

Представляем HttpMate

Никто не хочет писать плохой код. Никто не начинает разработку приложения с мысли: «Я собираюсь создать наиболее запутанный и нечитаемый код и убедиться, что он не расширяемый и его сложно изменить или перемещаться по нему». Каждый начинает с благих намерений, возможно, даже имея в виду все принципы Чистого кода и SOLID. Однако компромиссы начинают быстро распространяться и размножаться, как правило, в зависимости от количества задействованных внешних зависимостей.

Мы, например, завидовали, что не нашли какой-либо инфраструктуры, которая позволила бы нам разрабатывать веб-приложение и с чистой совестью заявлять, что его бизнес-логика не зависит от базового HTTP-сервера, уровня персистентности или (де) механизма сериализации (также упоминается как «код инфраструктуры» в DDD).

Если вы чувствуете, что больше не разрабатываете свое приложение, а продолжаете «интегрировать» и «интегрировать» фреймворк, сражаться с его демонами и никогда не иметь времени для реальной бизнес-логики. Если вы устали от бесконечного рефакторинга только потому, что вышла новая версия фреймворка. Если вы не уверены, какую аннотацию использовать больше, и откровенно устали от инвазивности используемой вами структуры HTTP, то HttpMate для вас.

Это неинвазивный, гибкий и ультра-расширяемый. HttpMate предлагает вам 3 режима обработки HTTP-запросов — управляемый UseCase, низкоуровневый HTTP и управляемый событиями запрос, а также смешивание этих режимов для получения максимальной отдачи от многофункциональной среды.

Без лишних слов, давайте посмотрим несколько примеров кода.

Низкоуровневая обработка HTTP-запросов

1
2
3
4
5
6
7
final HttpMate httpMate = HttpMate.aLowLevelHttpMate()
        .get("/api/hello", (httpRequest, httpResponse) -> {
            final Optional<String> name = httpRequest.queryParameters().getQueryParameter("name");
            httpResponse.setBody("Hello " + name.orElse("World"));
            httpResponse.setStatus(OK);
        })
        .build();

В этом фрагменте используется низкоуровневый HTTP-компоновщик HttpMate, и он лишь поверхностно рассматривает возможности.
Вы можете легко зарегистрировать обработчики для любой комбинации путь / http метод. В лямбда-обработчике у вас есть объекты запроса и ответа, и обработчик может быть настолько сложным, насколько вам нужно.
Ознакомьтесь с разделом примеров репозитория для получения дополнительной информации об API низкого уровня.

Вы, наверное, видели, что каждая другая HTTP-инфраструктура предоставляет простой способ написания небольших обработчиков запросов, и хотя это отличный способ дать представление о синтаксисе фреймворка и отличный инструмент маркетинга, любая реальная задача включает в себя больше, чем « просто обрабатывая запрос с помощью вызова функции ». Мир отчаянно нуждается в HTTP-инфраструктуре, которая обеспечивала бы надлежащий уровень абстракции между обработкой запросов и бизнес-логикой и позволяла бы вам не идти на компромисс по важным вопросам — чистой архитектуре и расширяемости.

Пример использования

HttpMate позволяет вам «просто публиковать свою бизнес-логику как конечную точку HTTP». Давайте рассмотрим вариант использования отправки электронного письма, чтобы продемонстрировать это.

Мы еще не знаем, как будет выглядеть конечная точка HTTP, но мы знаем, что нам нужен объект электронной почты, представляющий детали электронной почты:

  • отправитель
  • Приемник
  • Тема
  • тело

и нам нужно будет вернуть, скажем, квитанцию ​​за каждое отправленное письмо:

  • Номер Отслеживания
  • Дата

и у нас будет класс, отвечающий за отправку электронной почты, который будет выглядеть примерно так:

1
2
3
4
5
6
public class SendEmailUseCase {
    ...
 
    public Receipt sendEmail(final Email email) { ...}
    ...
}

Теперь вы можете использовать конструктор HttpMate для публикации этого варианта использования — учитывая, что вы решили, какой URL-адрес и какие методы HTTP будут отвечать за предоставление этого UseCase пользователю:

1
2
3
4
5
6
7
final HttpMate useCaseDrivenHttpMate = HttpMate.anHttpMateConfiguredAs(UseCaseDrivenBuilder.USE_CASE_DRIVEN)
    .post("/api/sendEmail", SendEmailUseCase.class)
    .mappingRequestsAndResponsesUsing(
        mapMate()
        ...
    )
    .build();

Первая часть не требует пояснений: вызовите SendEmailUseCase после POST для «/ api / sendEmail».

И «Как получилось, SendEmailUseCase получает действительный экземпляр электронной почты?» может спросить талантливый читатель.

Это действительно правильный вопрос, это самая сложная техническая деталь этого примера, и где прячется дьявол. Чтобы эта статья была сфокусирована на HttpMate и легко читаемой, мы попросили другого помощника отбиться от этого дьявола. Об этом отважном помощнике мы поговорим в другом посте .

По умолчанию HttpMate использует пустой конструктор по умолчанию класса UseCase для его инициализации. Тем не менее, HttpMate может быть легко настроен для использования любого механизма внедрения зависимостей, добавив вызов в конструктор; Следующий пример демонстрирует, что с помощью Google Guice:

1
2
3
4
5
6
7
final HttpMate useCaseDrivenHttpMate = HttpMate.anHttpMateConfiguredAs(UseCaseDrivenBuilder.USE_CASE_DRIVEN)
    .post("/api/sendEmail", SendEmailUseCase.class)
    .mappingRequestsAndResponsesUsing(
        mapMate()
    )
    .configured(toCreateUseCaseInstancesUsing(INJECTOR::getInstance))
    .build();

Ознакомьтесь с этим репозиторием на github, чтобы получить более подробный пример SendEmailUseCase.

Заключительные слова

Существует множество фреймворков, предоставляющих конфигурацию конечных точек HTTP, однако, в большинстве случаев приятная и блестящая демонстрация не переживает трудностей реальности. Мы хотели создать что-то, что, будучи простым и интуитивно понятным в настройке, могло бы помочь вам в разработке ваших приложений, предоставить вам инструменты для создания чистого кода и архитектуры и стать хорошей основой для ваших вариантов использования.

И это еще не все! Помните, как я сказал вам, это просто царапает поверхность возможностей? HttpMate вместе с другими «помощниками», над которыми мы работаем, может предложить больше: веб-сокеты, управляемый событиями подход к HTTP, правильные составные запросы, обработка сериализованных и десериализованных запросов и ответов и т. Д. Следите за новостями о Mate семья!

Мы будем рады услышать ваши отзывы и получить ваш вклад, так что ознакомьтесь с репозиторием GitHub для HttpMate и Happy Coding!

Смотрите оригинальную статью здесь: Представляем HttpMate

Мнения, высказанные участниками Java Code Geeks, являются их собственными.