在 Vert.x 中,REST 端点应该 return Future<T> 还是 T?

In Vert.x, should REST endpoints return Future<T> or T?

我很难找到正确 return 类型的文档。

例如,如果我有一个 REST 端点,它查找和 return 一个字符串,端点是否应该具有 return 类型 Future<String>String?此外,这会对事件循环产生什么影响(即 returning String over Future<String> 会导致更多阻塞)?

谢谢!

如果您在 https://vertx.io/get-started 查看 quick-start 的第 (2) 节,您会看到我粘贴在下面的代码块(我添加了一些编号的注释):

// Mount the handler for all incoming requests at every path and HTTP method
router
  .route()  // (1)
  .handler(context -> {  // (2)
    // Get the address of the request
    String address = context.request().connection().remoteAddress().toString();
    // Get the query parameter "name"
    MultiMap queryParams = context.queryParams();
    String name = queryParams.contains("name") ? queryParams.get("name") : "unknown";
    // Write a json response
    context.json(  // (3)
      new JsonObject()
        .put("name", name)
        .put("address", address)
        .put("message", "Hello " + name + " connected from " + address)
    );
  });

这是做什么的:

  1. 注册一个 Handler(基本上是一个回调),路由器收到的每个请求都会被调用。
  2. 将使用 RoutingContext 调用处理程序,其中包含对代表当前请求的 HttpServerRequest object 的引用,以及 HttpServerResponse object代表响应。后者允许您控制发送回客户端的响应(即 headers、body 等)。
  3. context.json() 是编写 JSON 格式化响应负载的便捷方法 - body 将被正确格式化,content-type header 将被正确格式化设置等

从根本上说,.json() 正在做的是:

  final JsonObject myJson = ...;
  
  final Buffer myJsonBuffer = Json.encodeToBuffer(myJson);

  context.response()
      .putHeader(HttpHeaders.CONTENT_TYPE, "application/json")
      .write(myJsonBuffer);

最后三行是将响应实际发送回客户端的方式。

有关更详细的解释,请查看有关响应 here 的 Vert.x Web 文档。

Out of the box Vert.x allows any primitive/simple type, String, or buffers to be sent as messages. However, it’s a convention and common practice in Vert.x to send messages as JSON

我想这就是您要找的documentation。你可以 return 字符串到 eventBus。虽然 Json 最常用

new JsonObject().put("key", "stringValue"); 

return String 比 Future 更好。未来将需要特殊的编解码器。