2016-05-25 16 views
5

On Async Http Client documentation tôi xem làm thế nào để có được một Future<Response> như là kết quả của một HTTP đồng bộ Nhận yêu cầu chỉ đơn giản là làm, ví dụ:Tôi làm cách nào để có được một CompletableFuture <T> từ yêu cầu 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(); 

Tuy nhiên, để thuận tiện tôi muốn để có được một CompletableFuture<T> thay vào đó, mà tôi có thể áp dụng một sự tiếp tục chuyển đổi kết quả trong một cái gì đó khác, ví dụ như deserializing nội dung phản hồi từ Json vào một đối tượng Java (ví dụ: SoccerSeason.java). Đây là những gì tôi muốn làm:

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

Theo Async Http Client documentation cách duy nhất để làm điều này là thông qua một đối tượng AsyncCompletionHandler<T> và sử dụng một lời hứa. Vì vậy, tôi đã xây dựng một auxiliary method cho mục đích đó:

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

Với phương pháp hữu ích này, tôi có thể viết lại ví dụ trước chỉ thực hiện:

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

Có cách nào tốt hơn nhận được một CompletableFuture<T> từ một khách hàng Async Http yêu cầu?

Trả lời

9

Với AHC2:

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

Ông có thể bao gồm một 'CompletableFuture ' ví dụ sử dụng trong 'Readme.md' của [AHC2 repo] (https://github.com/AsyncHttpClient/async-http-client)? Tôi nghĩ nó hữu ích. –

+0

Contribs chào đón! Tôi thực sự đầm lầy atm. –

Các vấn đề liên quan