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 リクエストから取得するより良い方法はありますか?