gpt4 book ai didi

java - 如何在 Java 中使用带有 WebClient 的 Vertx 路由器中的 future

转载 作者:行者123 更新时间:2023-11-29 04:17:09 26 4
gpt4 key购买 nike

我有一个带有路由器端点的 Vertx 应用程序:

router.route(HttpMethod.GET, Constants.ENDPOINT).blockingHandler(this::getItems);

此路由器调用一个方法,该方法应该在浏览器或任何客户端调用此端点中返回一个 JSON 对象。 JSON 对象实际上来自完全不同的服务。我正在使用 Vert.x 的 WebClient 库来调用此服务。

    private void getItems(RoutingContext routingContext) {
HttpServerResponse response = routingContext.response();
response.setChunked(true);
response.putHeader("content-type", "text/plain");
response.putHeader("Access-Control-Allow-Origin", "*");
JsonObject data = new JsonObject();
WebClient webClient = WebClient.create(vertx);
webClient.post(80, "my-site.com", "/api/items")
.as(BodyCodec.jsonArray())
.putHeader("Accept", "application/json")
.putHeader("Content-Type", "application/json")
.sendJsonObject(new JsonObject().put("mutator", "*"), ar -> {
if (ar.succeeded()) {
HttpResponse<JsonArray> result = ar.result();
JsonArray body = result.body();
System.out.println(body);
data.put("data", body.getJsonObject(0));
} else {
data.put("data", ar.cause().getMessage());
}
});
response.write(data.encode());
routingContext.response().end();
}

我从 my-site.com 获得的数据没有问题,并使用我的 System.out 命令显示在控制台中。问题是我无法将其写入 response.write

往上看,我发现这与 future 有关。我不太了解这个概念,所以我一直在阅读大量书籍,但找不到适合我的特定代码的任何示例。

我将如何着手实现 future ,以便我从 my-site.com 收到的数据被放入我的 Json 对象(data),然后可以在 response.write 中使用?

最佳答案

在您的 impl 数据中将是一个空的 JSON 对象,因为 Webclient 是异步的。在 Web 客户端的响应准备好之前,您正在将响应写入客户端。

将写入移动到 webclient 响应中并在那里结束上下文。例如:

...

if (ar.succeeded()) {
HttpResponse<JsonArray> result = ar.result();
JsonArray body = result.body();
System.out.println(body);
data.put("data", body.getJsonObject(0));
} else {
data.put("data", ar.cause().getMessage());
}

response.write(data.encode());
routingContext.response().end();

...

关于java - 如何在 Java 中使用带有 WebClient 的 Vertx 路由器中的 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51637072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com