2016-05-25 14 views
5

Na Async Http Client documentation widzę jak zdobyć Future<Response> w wyniku asynchronicznego HTTP GET żądanie po prostu robi, na przykład:Jak uzyskać CompletableFuture <T> z żądania klienta Async Http?

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

Jednak dla wygody chciałbym uzyskać CompletableFuture<T> zamiast, na których mogłem zastosuj kontynuację, która przekształca wynik w coś innego, na przykład deserializację treści odpowiedzi z Json na obiekt Java (np. SoccerSeason.java). To jest to, co chciałbym zrobić:

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

Według Async Http Client documentation jedynym sposobem, aby to zrobić za pośrednictwem AsyncCompletionHandler<T> obiektu oraz za pomocą obietnicy. Więc zbudował auxiliary method do tego celu:

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

Dzięki tej metodzie użytkowego mogę przepisać poprzedni przykład właśnie robi:

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

Czy istnieje lepszy sposób na uzyskanie CompletableFuture<T> z Klientem asynchroniczny HTTP żądanie?

Odpowiedz

9

Z AHC2:

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

mógłbyś włączyć 'CompletableFuture Przykład użycia' 'w Readme.md' dnia [AHC2 repo] (https://github.com/AsyncHttpClient/async-http-client)? Myślę, że to jest przydatne. –

+0

Contribs welcome! Naprawdę zalałem bankomat. –

Powiązane problemy