2016-05-25 3 views
5

Sur Async Http Client documentation je vois comment obtenir un Future<Response> à la suite d'une requête HTTP asynchrone Obtenir demande simplement faire, par exemple:Comment puis-je obtenir un CompletableFuture <T> à partir d'une requête Async Http Client?

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

Cependant, pour plus de commodité, je voudrais obtenir un CompletableFuture<T> à la place, pour que je pouvais appliquer une continuation qui convertit le résultat en quelque chose d'autre, par exemple en désérialisant le contenu de la réponse de Json dans un objet Java (par exemple SoccerSeason.java). Voilà ce que je voudrais faire:

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

Selon Async Http Client documentation la seule façon de le faire est à travers un objet AsyncCompletionHandler<T> et en utilisant une promesse. Alors je construit un auxiliary method à cette fin:

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

Avec cette méthode utilitaire je peux réécrire l'exemple précédent font que:

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

Y at-il une meilleure façon d'obtenir un CompletableFuture<T> d'un Async Http client demande?

Répondre

9

Avec AHC2:

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

Pourriez-vous inclure un exemple d'utilisation '' CompletableFuture dans 'Readme.md' de [repo AHC2] (https://github.com/AsyncHttpClient/async-http-client)? Je pense que c'est utile. –

+0

Contribue bienvenue! J'ai vraiment submergé l'atm. –