Как получить CompletableFuture от HttpClient Jetty? - PullRequest
0 голосов
/ 07 мая 2018

Можно ли использовать выдачу асинхронного HTTP-запроса с использованием Jetty и получить обратно CompletableFuture?

Я прочитал документы , но не смог найти никаких примеров для этого. Я обнаружил внутреннее использование CompletableFuture , но я не мог понять, как получить к нему доступ с помощью общедоступного API.

ОБНОВЛЕНИЕ : мне нужно CompletableFuture, чтобы также вернуть тело ответа (не только код ответа и заголовки).

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Я использую это с клиентом Jetty 9.4.x

var completable = new CompletableFuture<ContentResponse>();
client
  .newRequest(uri)
  .send(new CompletableFutureResponseListener(completable));

где

public class CompletableFutureResponseListener extends BufferingResponseListener {
  private final CompletableFuture<ContentResponse> completable;

  public CompletableFutureResponseListener(
      CompletableFuture<ContentResponse> completable) {
    this.completable = completable;
  }

  @Override
  public void onComplete(Result result) {
    if (result.isFailed()) {
      completable.completeExceptionally(result.getFailure());
    } else {
      var response =
          new HttpContentResponse(
              result.getResponse(), 
              getContent(), 
              getMediaType(), 
              getEncoding());
      completable.complete(response);
    }
  }
}
0 голосов
/ 10 мая 2018

Преобразовать CompleteListener в CompletableFuture тривиально:

CompletableFuture<Result> completable = new Promise.Completable<>();
httpClient.newRequest(...).send(result -> {
    if (result.isFailed()) {
        completable.completeExceptionally(result.getFailure());
    } else {
        completable.complete(result);
    }
});

Однако вы правы в том, что это может сделать сама HttpClient.Трек этот выпуск .

...