11

Async Http Client documentationでは、非同期 HTTP Get リクエストの結果としてa を取得する方法を確認できますFuture<Response>。たとえば、次のようにします。

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>オブジェクトを介して promise を使用することです。だから私はその目的のために補助的な方法を構築しました:

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

CompletableFuture<T>Async Http Client リクエストから取得するより良い方法はありますか?

4

1 に答える 1