在 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)
);
});
这是做什么的:
- 注册一个
Handler
(基本上是一个回调),路由器收到的每个请求都会被调用。
- 将使用
RoutingContext
调用处理程序,其中包含对代表当前请求的 HttpServerRequest
object 的引用,以及 HttpServerResponse
object代表响应。后者允许您控制发送回客户端的响应(即 headers、body 等)。
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 更好。未来将需要特殊的编解码器。
我很难找到正确 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)
);
});
这是做什么的:
- 注册一个
Handler
(基本上是一个回调),路由器收到的每个请求都会被调用。 - 将使用
RoutingContext
调用处理程序,其中包含对代表当前请求的HttpServerRequest
object 的引用,以及HttpServerResponse
object代表响应。后者允许您控制发送回客户端的响应(即 headers、body 等)。 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 更好。未来将需要特殊的编解码器。