Как получить CompletableFuture <T> из запроса Async Http Client?
НаAsync Http Client документация Я вижу, как получитьFuture<Response>
в результате асинхронного HTTP-запроса Get просто выполняем, например:
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 документация единственный способ сделать это черезAsyncCompletionHandler<T>
возражать и использовать обещание. Поэтому я построилвспомогательный метод с этой целью:
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?