2016-05-25 12 views
5

Su Async Http Client documentation vedo come ottenere una Future<Response> come il risultato di un HTTP asincrono Get richiesta semplicemente facendo, ad esempio:Come posso ottenere un CompletableFuture <T> da una richiesta del client Http asincrono?

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

Tuttavia, per comodità vorrei ottenere un CompletableFuture<T> invece, per il quale ho potuto applica una continuazione che converte il risultato in qualcos'altro, ad esempio deserializzando il contenuto della risposta da Json in un oggetto Java (ad esempio SoccerSeason.java). Questo è quello che vorrei fare:

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); 

Secondo Async Http Client documentation l'unico modo per farlo è attraverso un oggetto AsyncCompletionHandler<T> e l'utilizzo di una promessa. Così ho costruito un auxiliary method a tal fine:

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; 
} 

Con questo metodo di utilità che posso riscrivere l'esempio precedente solo facendo:

getDataAsync("http://api.football-data.org/v1/soccerseasons/398") 
    .thenApply(r -> gson.fromJson(r.getResponseBody(), SoccerSeason.class)) 
    .thenAccept(System.out::println); 

non v'è alcun modo migliore di ottenere un CompletableFuture<T> da un client Async Http richiesta?

risposta

9

Con AHC2:

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

Potrebbe includere un CompletableFuture '' esempio l'utilizzo in 'Readme.md' di [repo AHC2] (https://github.com/AsyncHttpClient/async-http-client)? Penso che sia utile. –

+0

Contributi benvenuti! Sono davvero inondato –

Problemi correlati