HTTP 与 Web

向其他服务执行 HTTP 请求

本文档将向您展示如何向其他服务执行 HTTP 请求。

您将构建什么

您将构建一个 Vert.x 应用程序,该应用程序使用 https://icanhazdadjoke.com/api 上的 API,并每隔 3 秒显示一个新的笑话。

run

该应用程序只需一个 JokeVerticle 类即可实现。

您需要什么

  • 文本编辑器或 IDE

  • Java 11 或更高版本

  • Maven 或 Gradle

创建项目

此项目的代码包含功能等效的 Maven 和 Gradle 构建文件。

使用 Maven

以下是您应该使用的 pom.xml 文件的内容

使用 Gradle

假设您使用 Kotlin DSL 的 Gradle,您的 build.gradle.kts 文件应如下所示

使用 Vert.x web 客户端获取笑话

与 Vert.x 核心 API 中更底层的 API 相比,Vert.x web 客户端极大地简化了 HTTP 请求的创建。WebClient 类可以在 io.vertx:vertx-web-client 工件中找到。

为了获取新的笑话,我们需要向 https://icanhazdadjoke.com/api 发送 HTTP GET 请求。为了每隔 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 获取附加到当前 Vert.x 实例的 WebClient
2 对主机 icanhazdadjoke.com443 端口(HTTPS)的路径 / 发送 HTTP GET 请求。
3 不要忘记启用 SSL 加密。
4 明确表示我们需要 JSON 数据。
5 响应将自动转换为 JSON。
6 我们期望 HTTP 200 状态码,否则响应将失败。
7 响应体是一个 JSON 对象,我们将其结果写入控制台。

运行应用程序

JokeVerticle 已经包含一个 main 方法,因此可以直接用于

  1. 创建 Vertx 上下文,然后

  2. 部署 JokeVerticle

您可以从以下方式运行应用程序

  1. 您的 IDE,通过运行 JokeVerticle 类中的 main 方法,或者

  2. 使用 Maven:mvn compile exec:java,或者

  3. 使用 Gradle:./gradlew run (Linux, macOS) 或 gradle run (Windows)。

总结

本文档涵盖了

  1. 用于发起 HTTP 请求的 Vert.x web 客户端,

  2. 从 JSON 响应中提取数据,

  3. Vert.x 周期性任务。