Spec-Zone.ru › Vert.x 5

Выполнение HTTP-запросов к другим службам

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

Что вы будете создавать

Вы создадите приложение Vert.x, которое будет использовать API по адресу https://icanhazdadjoke.com/api и отображать новый анекдот каждые 3 секунды:

run

Приложение помещается в один JokeVerticle класс.

Что вам потребуется

  • Текстовый редактор или IDE

  • Java 11 или выше

  • Maven или Gradle

Создание проекта

Код этого проекта содержит файлы сборки Maven и Gradle, которые функционально эквивалентны.

Использование Maven

Вот содержимое файла pom.xml, который вы должны использовать:

Maven pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>io.vertx.howtos</groupId>
  <artifactId>http-client-howto</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <vertx.version>5.0.0.CR2</vertx.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>io.vertx</groupId>
        <artifactId>vertx-stack-depchain</artifactId>
        <version>${vertx.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>io.vertx</groupId>
      <artifactId>vertx-core</artifactId>
    </dependency>
    <dependency>
      <groupId>io.vertx</groupId>
      <artifactId>vertx-web-client</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.13.0</version>
        <configuration>
          <release>11</release>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>3.5.0</version>
        <configuration>
          <mainClass>io.vertx.howtos.httpclient.JokeVerticle</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

Использование Gradle

Предполагая, что вы используете Gradle с Kotlin DSL, вот как должен выглядеть ваш файл build.gradle.kts:

Gradle build.gradle.kts
plugins {
  java
  application
}

repositories {
  mavenCentral()
}

dependencies {
  val vertxVersion = "5.0.0.CR2"
  implementation("io.vertx:vertx-core:${vertxVersion}")
  implementation("io.vertx:vertx-web-client:${vertxVersion}")
}

application {
  mainClass = "io.vertx.howtos.httpclient.JokeVerticle"
}

Получение анекдотов с помощью Vert.x web client

Vert.x web client значительно упрощает выполнение HTTP-запросов по сравнению с более низкоуровневым API, найденным в ядре Vert.x. Он делает WebClient класс можно найти в артефакте io.vertx:vertx-web-client.

Чтобы получить новые анекдоты, нам необходимо выполнить HTTP-GET-запросы к https://icanhazdadjoke.com/api. Для этого каждые 3 секунды мы просто будем использовать периодический таймер Vert.x.

API возвращает простые JSON-объекты. Мы можем протестировать его с помощью инструмента командной строки, такого как curl:

$ curl -H "Accept: application/json" https://icanhazdadjoke.com/
{"id":"IJBAsrrzPmb","joke":"What do you call a cow with two legs? Lean beef.","status":200}

Вот код класса JokeVerticle:

package io.vertx.howtos.httpclient;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpResponseExpectation;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.client.HttpRequest;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.codec.BodyCodec;

public class JokeVerticle extends AbstractVerticle {

  private HttpRequest<JsonObject> request;

  @Override
  public void start() {

    request = WebClient.create(vertx) (1)
      .get(443, "icanhazdadjoke.com", "/") (2)
      .ssl(true)  (3)
      .putHeader("Accept", "application/json")  (4)
      .as(BodyCodec.jsonObject()); (5)

    vertx.setPeriodic(3000, id -> fetchJoke());
  }

  private void fetchJoke() {
    request.send()
      .expecting(HttpResponseExpectation.SC_OK)  (6)
      .onSuccess(result -> {
        System.out.println(result.body().getString("joke")); (7)
        System.out.println("🤣");
        System.out.println();
      })
      .onFailure(e -> System.out.println("No joke fetched: " + e.getMessage()));
  }

  public static void main(String[] args) {
    Vertx vertx = Vertx.vertx();
    vertx.deployVerticle(new JokeVerticle()).await();
  }
}
1 Получить экземпляр WebClient, прикрепленный к текущему экземпляру Vert.x.
2 HTTP-запрос GET для пути / к хосту icanhazdadjoke.com на порту 443 (HTTPS).
3 Не забудьте включить шифрование SSL.
4 Явно укажите, что мы хотим JSON-данные.
5 Ответ автоматически преобразуется в JSON.
6 Ожидается HTTP-статус-код 200, в противном случае запрос завершится ошибкой.
7 Тело — JSON-объект, и мы записываем результат в консоль.

Запуск приложения

В JokeVerticle уже есть метод main, поэтому его можно использовать как есть для:

  1. создания контекста Vertx, а затем

  2. развертывания JokeVerticle.

Вы можете запустить приложение из:

  1. вашей IDE, запустив метод main из класса JokeVerticle, или

  2. с помощью Maven: mvn compile exec:java, или

  3. с помощью Gradle: ./gradlew run (Linux, macOS) или gradle run (Windows).

Заключение

В этом документе рассматривались:

  1. Vert.x web client для выполнения HTTP-запросов,

  2. извлечение данных из JSON-ответа,

  3. периодические задачи Vert.x.

См. также

  • Документация по API ядра Vert.x

  • Документация по Vert.x web client

© 2025 Eclipse Vert.x™Eclipse Vert.x™ is open source and dual-licensed under the Eclipse Public License 2.0 and the Apache License 2.0.Website design by Michel Krämer.
https://vertx.io/docs/howtos/http-client-howto/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API