Как получить 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?
1 ответ
С AHC2:
CompletableFuture<Response> f = asyncHttpClient
.prepareGet("http://api.football-data.org/v1/soccerseasons/398")
.execute()
.toCompletableFuture();