5
在Async Http Client documentation我看看如何获得Future<Response>
作为异步HTTP的结果Get请求简单地做,例如:如何从异步Http客户端请求获得CompletableFuture <T>?
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 documentation做到这一点的唯一方法是通过AsyncCompletionHandler<T>
对象,并使用一个承诺。所以,我建立了一个auxiliary method为此:
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>
什么更好的办法请求?
你能包括在'[AHC2回购]的Readme.md'(一个'CompletableFuture'使用例https://github.com/AsyncHttpClient/async-http-client )?我认为这很有用。 –
Contribs欢迎!我真的淹没了atm。 –