如何从异步Http客户端请求获取CompletableFuture<T>?

11

我在 Async Http Client 文档 上看到,要获得一个异步 HTTP Get 请求的 Future<Response> 结果,只需简单地执行以下操作:

AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient();
Future<Response> f = asyncHttpClient
      .prepareGet("http://api.football-data.org/v1/soccerseasons/398")
      .execute();
Response r = f.get();

然而,为了方便起见,我希望得到一个 CompletableFuture<T>,以便我可以应用一个继续操作来将结果转换为其他内容,例如将响应内容从Json反序列化为Java对象(例如SoccerSeason.java)。这就是我想做的事情:
AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient();
CompletableFuture<Response> f = asyncHttpClient
     .prepareGet("http://api.football-data.org/v1/soccerseasons/398")
     .execute();
f
     .thenApply(r -> gson.fromJson(r.getResponseBody(), SoccerSeason.class))
     .thenAccept(System.out::println);

根据Async Http Client文档,唯一的方法是通过AsyncCompletionHandler<T>对象并使用Promise来完成。因此,我构建了一个辅助方法来实现这一目标。
CompletableFuture<Response> getDataAsync(String path){
    CompletableFuture<Response> promise = new CompletableFuture<>();
    asyncHttpClient
            .prepareGet(path)
            .execute(new AsyncCompletionHandler<Response>() {
                @Override
                public Response onCompleted(Response response) throws Exception {
                    promise.complete(response);
                    return response;
                }
                @Override
                public void onThrowable(Throwable t) {
                    promise.completeExceptionally(t);
                }
            });
    return promise;
}

使用这个实用方法,我可以通过以下方式重写上一个示例:
getDataAsync("http://api.football-data.org/v1/soccerseasons/398")
    .thenApply(r -> gson.fromJson(r.getResponseBody(), SoccerSeason.class))
    .thenAccept(System.out::println);

有没有更好的方法从异步Http客户端请求中获取CompletableFuture<T>

1个回答

15

使用AHC2:

CompletableFuture<Response> f = asyncHttpClient
     .prepareGet("http://api.football-data.org/v1/soccerseasons/398")
     .execute()
     .toCompletableFuture();

你能否在AHC2 repoReadme.md中包含一个使用CompletableFuture<T>的示例?我认为这将会很有用。 - Miguel Gamboa
1
@StephaneLandelle 文档中提到:“请注意,取消此CompletableFuture不会正确地取消正在进行的请求。在下一个版本中,我们很有可能返回CompletionStage。” 想知道最新版本中是否有可用的正确取消请求的CompletableFuture? - user1571307

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接