2016-05-25 28 views
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>什么更好的办法请求?

回答

9

随着AHC2:

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

你能包括在'[AHC2回购]的Readme.md'(一个'CompletableFuture '使用例https://github.com/AsyncHttpClient/async-http-client )?我认为这很有用。 –

+0

Contribs欢迎!我真的淹没了atm。 –