Como obtenho um CompletableFuture <T> de uma solicitação do cliente HTTP assíncrono?
EmDocumentação do cliente assíncrono Http Eu vejo como conseguir umFuture<Response>
como resultado de uma solicitação HTTP Get assíncrona, basta fazer, por exemplo:
AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient();
Future<Response> f = asyncHttpClient
.prepareGet("http://api.football-data.org/v1/soccerseasons/398")
.execute();
Response r = f.get();
No entanto, por conveniência, gostaria de obter umaCompletableFuture<T>
em vez disso, para o qual eu poderia aplicar uma continuação que converte o resultado em outra coisa, por exemplo, desserializando o conteúdo da resposta do Json em um objeto Java (por exemplo,SoccerSeason.java) Isto é o que eu gostaria de fazer:
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);
De acordo comDocumentação do cliente assíncrono Http a única maneira de fazer isso é através de umAsyncCompletionHandler<T>
objeto e usando uma promessa. Então eu construí ummétodo auxiliar para esse fim:
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;
}
Com este método utilitário, posso reescrever o exemplo anterior, fazendo o seguinte:
getDataAsync("http://api.football-data.org/v1/soccerseasons/398")
.thenApply(r -> gson.fromJson(r.getResponseBody(), SoccerSeason.class))
.thenAccept(System.out::println);
Existe alguma maneira melhor de obter umCompletableFuture<T>
de uma solicitação do cliente HTTP assíncrono?