Время прочтения: 3 мин.

В предыдущей статье мы рассмотрели, что такое Vert.x, примеры его создания и развертывания, примеры отправки сообщений с использованием протокола TCP. В данной статье продолжим изучение фреймворка Vert.x, изучив передачу сообщений с использованием протокола HTTP.

Примеры передачи сообщений с использованием протокола HTTP

Создание HTTP сервера

Создание сервера для получения приложением запросов (формат – HTTP) осуществляется посредством экземпляра vertx методом createHttpServer.

Мы уже знаем, что сервер запускается изнутри Verticle, таким образом, все обработчики, зарегистрированные на сервере HTTP, будут выполняться в потоке, запустившем этот Verticle.

После создания HTTP сервера он может быть запущен с помощью метода listen. Для обработки входящих запросов необходимо задать обработчик запросов на сервере. Делается это следующим образом (ссылка на githab)

Для отправки ответа на пришедший запрос необходимо получить экземпляр HttpServerResponse из объекта запроса. Пример:

HttpServerResponse response = request.response();

После получения экземпляра HttpServerResponse можно установить статус-код и заголовки HTTP ответа вроде этого:

response.setStatusCode(200);
response.headers().add("Content-Length", String.valueOf(57))
.add("Content-Type", "text/html");

С помощью метода write пишется тело HTTP ответа, как это:

response.write("Vert.x is alive!");
response.end();

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

Для закрытия HTTP сервера вызывается метод сlose следующим образом:

httpServer.close();

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

Создание HTTP клиента

Экземпляр vertx содержит метод создания асинхронного HTTP клиента.

public class VertxHttpClientVerticle extends AbstractVerticle {
    @Override
    public void start() throws Exception {
        HttpClient httpClient = vertx.createHttpClient();
    }
}

Следует помнить, что все IO действия в Vert.x должны выполняться асинхронно, чтобы избежать блокирования цикла обработки событий. Встроенные в Java URL и URLConnection не являются асинхронными, так что их использование в Vert.x-приложениях невозможно.

После создания HTTP клиента можно отправить GET запрос, используя метод getNow. (пример — githab)

Если не требуется получать доступ к телу ответа, его можно обработать уже в обработчике getNow. Однако если надо получить доступ к телу HTTP ответа, необходимо зарегистрировать еще один обработчик на HttpClientResponse. (ссылка на githab)

HttpClient содержит также способы отправки GET, POST, PUT, DELETE запросов и содержит больше возможностей для настройки HttpClient (для обработки ответа HTTP постепенно, по мере поступления тела ответа — вместо обработки при получении всего тела).

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