2016-05-25 2 views
5

は、私には、例えば、要求は単にやって入手非同期HTTPの結果としてFuture<Response>を取得する方法を参照してください。Async Http ClientリクエストからCompletableFuture <T>を取得するにはどうすればよいですか? <a href="https://github.com/AsyncHttpClient/async-http-client" rel="nofollow">Async Http Client documentation</a>オン

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>を得るための任意のより良い方法はあります要求? AHC2で

答えて

9

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

歓迎です!私は本当にatmを襲った。 –

関連する問題