我在 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>
?
Readme.md
中包含一个使用CompletableFuture<T>
的示例?我认为这将会很有用。 - Miguel Gamboa