如何从 Jetty 的 HttpClient 获取 CompletableFuture?

How to get a CompletableFuture from Jetty's HttpClient?

是否可以使用 Jetty 发出异步 HTTP 请求并取回 CompletableFuture

我读过 the docs but could not find any examples of doing so. I found internal usage of CompletableFuture 但我不知道如何使用 public API.

访问它

更新:我还需要 CompletableFuture 到 return 响应 body(不仅仅是响应代码和 headers).

通过这种方式将 CompleteListener 转换为 CompletableFuture 很简单:

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

但是,您说得对,这可以由 HttpClient 自己完成。曲目 this issue.

我一直在使用 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);
    }
  }
}