开始使用 Vert.x

在本文中,您将学会如何开始编写一个新的 Vert.x Web 项目。

在正式开始前,您需要准备:

  • JDK 1.8 或更高版本
  • 文本编辑器或 IDE
  • Maven 3 或更高版本
  • curl 或 HTTPie ,或浏览器,用于执行 HTTP 请求

1 起步

打开 start.vertx.io 网页创建一个新项目。

选择您所需的 Vert.x 版本,Lan­guage 选择 Java,Build 选择 Maven, 然后输入您的 GroupId 和 Ar­ti­fac­tId。然后在 “De­pen­den­cies” 文本框输入 Vert.x Web 并将其选择添加为依赖。选择完成后,点击 Gen­er­ate Project 按钮。 将zip文件保存到您的电脑,最后解压到任意目录。

以上步骤生成的项目包括:

  • Maven 构建配置文件 pom.xml ,已配置如何构建、运行 Vert.x 程序
  • Ver­ti­cle 示例,及对应的 JUnit5 单元测试
  • 指定了代码样式的 Ed­i­tor­Con­fig 插件配置
  • Git 的忽略文件配置(.git­ig­nore)

您也可以从以下地址直接下载示例项目: MavenGra­dle

2 编码

在任意编辑器打开项目,然后打开 src/main/java/com/example/starter/MainVerticle.java 文件。 源码中包含一个示例 Verticle (Vert.x 的最小部署单元),该 Vet­i­cle 启动一个HTTP服务。 您需要修改这个文件,以响应所有请求。 更改代码,如下所示:

Java
Kotlin
Groovy
public class MainVerticle extends AbstractVerticle {
  @Override
  public void start() throws Exception {
    // 创建一个路由
    Router router = Router.router(vertx);

    // 挂载 Handler,接收所有请求路径和请求方法的请求
    router.route().handler(context -> {
      // 获取请求的远程地址
      String address = context.request().connection().remoteAddress().toString();
      // 获取请求参数 "name" 的取值
      MultiMap queryParams = context.queryParams();
      String name = queryParams.contains("name") ? queryParams.get("name") : "unknown";
      // 写json响应
      context.json(
        new JsonObject()
          .put("name", name)
          .put("address", address)
          .put("message", "Hello " + name + " connected from " + address)
      );
    });

    // 创建 HTTP 服务
    vertx.createHttpServer()
      // 使用路由处理所有请求
      .requestHandler(router)
      // 开始监听端口
      .listen(8888)
      // 打印监听的端口
      .onSuccess(server ->
        System.out.println(
          "HTTP server started on port " + server.actualPort()
        )
      );
  }
}
class MainVerticle : AbstractVerticle() {
  override fun start() {
    // 创建一个路由
    val router = Router.router(vertx)

    // 挂载 Handler,接收所有请求路径和请求方法的请求
    router.route().handler { context ->
      // 获取请求的远程地址
      val address = context.request().connection().remoteAddress().toString()
      // 获取请求参数 "name" 的取值
      val queryParams = context.queryParams()
      val name = queryParams.get("name") ?: "unknown"
      // 写json响应
      context.json(
          json {
            obj(
              "name" to name,
              "address" to address,
              "message" to "Hello $name connected from $address"
            )
          }
      )
    }

    // 创建 HTTP 服务
    vertx.createHttpServer()
        // 使用路由处理所有请求
        .requestHandler(router)
        // 开始监听端口
        .listen(8888)
        // 打印监听的端口
        .onSuccess { server ->
          println("HTTP server started on port " + server.actualPort())
        }
  }
}
class MainVerticle extends AbstractVerticle {
  @Override
  void start() {
    // 创建一个路由
    def router = Router.router(vertx)

    // 挂载 Handler,接收所有请求路径和请求方法的请求
    router.route().handler { context ->
      // 获取请求的远程地址
      def address = context.request().connection().remoteAddress().toString()
      // 获取请求参数 "name" 的取值
      def queryParams = context.queryParams()
      String name = queryParams.get("name") ?: "unknown"
      // 写json响应
      context.json(
        new JsonObject()
          .put("name", name)
          .put("address", address)
          .put("message", "Hello " + name + " connected from " + address)
      )
    }

    // 创建 HTTP 服务
    vertx.createHttpServer()
      // 使用路由处理所有请求
      .requestHandler(router)
      // 开始监听端口
      .listen(8888)
      // 打印监听的端口
      .onSuccess { server ->
        println("HTTP server started on port " + server.actualPort())
      }
  }
}

以上代码创建了一个 Vert.x Web 路由(用于将HTTP请求路由到指定的请求处理器) 并以 8888 端口启动HTTP服务器。它对所有请求都返回一个JSON对象,内容包括请求的地址、 name 参数取值,以及欢迎信息。

3 运行

运行代码需要打开终端,并进入项目的目录。 通过以下命令构建应用:

$ mvn package

然后,运行应用:

$ mvn exec:java
HTTP server started on port 8888
apr 03, 2020 11:49:21 AM io.vertx.core.impl.launcher.commands.VertxIsolatedDeployer
INFO: Succeeded in deploying verticle

现在服务已经启动了,可以发送请求进行测试:

HTTPie
curl
$ http http://localhost:8888
HTTP/1.1 200 OK
content-length: 115
content-type: application/json; charset=utf-8

{
    "address": "0:0:0:0:0:0:0:1:32806",
    "message": "Hello unknown connected from 0:0:0:0:0:0:0:1:32806",
    "name": "unknown"
}

$ http http://localhost:8888\?name\="Francesco"
HTTP/1.1 200 OK
content-length: 119
content-type: application/json; charset=utf-8

{
    "address": "0:0:0:0:0:0:0:1:32822",
    "message": "Hello Francesco connected from 0:0:0:0:0:0:0:1:32822",
    "name": "Francesco"
}
$ curl -v http://localhost:8888
*   Trying ::1:8888...
* Connected to localhost (::1) port 8888 (#0)
> GET / HTTP/1.1
> Host: localhost:8888
> User-Agent: curl/7.69.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< content-type: application/json; charset=utf-8
< content-length: 115
<
* Connection #0 to host localhost left intact
{"name":"unknown","address":"0:0:0:0:0:0:0:1:59610","message":"Hello unknown connected from 0:0:0:0:0:0:0:1:59610"}

$ curl -v http://localhost:8888\?name\="Francesco"
*   Trying ::1:8888...
* Connected to localhost (::1) port 8888 (#0)
> GET /?name=Francesco HTTP/1.1
> Host: localhost:8888
> User-Agent: curl/7.69.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< content-type: application/json; charset=utf-8
< content-length: 119
<
* Connection #0 to host localhost left intact
{"name":"Francesco","address":"0:0:0:0:0:0:0:1:59708","message":"Hello Francesco connected from 0:0:0:0:0:0:0:1:59708"}

4 进一步了解

现在您已经体验了 Vert.x 入门的乐趣,以下的指南可以帮助您进一步了解 Vert.x :