Na Async Http Client documentation widzę jak zdobyć Future<Response>
w wyniku asynchronicznego HTTP GET żądanie po prostu robi, na przykład:Jak uzyskać CompletableFuture <T> z żądania klienta Async Http?
AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient();
Future<Response> f = asyncHttpClient
.prepareGet("http://api.football-data.org/v1/soccerseasons/398")
.execute();
Response r = f.get();
Jednak dla wygody chciałbym uzyskać CompletableFuture<T>
zamiast, na których mogłem zastosuj kontynuację, która przekształca wynik w coś innego, na przykład deserializację treści odpowiedzi z Json na obiekt Java (np. SoccerSeason.java). To jest to, co chciałbym zrobić:
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);
Według Async Http Client documentation jedynym sposobem, aby to zrobić za pośrednictwem AsyncCompletionHandler<T>
obiektu oraz za pomocą obietnicy. Więc zbudował auxiliary method do tego celu:
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;
}
Dzięki tej metodzie użytkowego mogę przepisać poprzedni przykład właśnie robi:
getDataAsync("http://api.football-data.org/v1/soccerseasons/398")
.thenApply(r -> gson.fromJson(r.getResponseBody(), SoccerSeason.class))
.thenAccept(System.out::println);
Czy istnieje lepszy sposób na uzyskanie CompletableFuture<T>
z Klientem asynchroniczny HTTP żądanie?
mógłbyś włączyć 'CompletableFuture Przykład użycia' 'w Readme.md' dnia [AHC2 repo] (https://github.com/AsyncHttpClient/async-http-client)? Myślę, że to jest przydatne. –
Contribs welcome! Naprawdę zalałem bankomat. –