如何从Jetty';什么是HttpClient?

如何从Jetty';什么是HttpClient?,jetty,completable-future,Jetty,Completable Future,是否可以使用Jetty发出异步HTTP请求并返回一个可完成的未来 我读过,但找不到任何这样做的例子。我找到了,但我不知道如何使用公共API访问它 更新:我需要CompletableFuture来返回响应正文(不仅仅是响应代码和标题)。用这种方式将completablelistener转换为CompletableFuture很简单: CompletableFuture completable=newpromise.completable(); httpClient.newRequest(…).se

是否可以使用Jetty发出异步HTTP请求并返回一个可完成的未来

我读过,但找不到任何这样做的例子。我找到了,但我不知道如何使用公共API访问它


更新:我需要
CompletableFuture
来返回响应正文(不仅仅是响应代码和标题)。

用这种方式将
completablelistener
转换为
CompletableFuture
很简单:

CompletableFuture completable=newpromise.completable();
httpClient.newRequest(…).send(结果->{
if(result.isFailed()){
completable.CompleteException(result.getFailure());
}否则{
完成(结果);
}
});

但是,您是对的,这可以由
HttpClient
本身完成。跟踪。

通过以下方式将
CompleteListener
转换为
CompletableFuture
是很简单的:

CompletableFuture completable=newpromise.completable();
httpClient.newRequest(…).send(结果->{
if(result.isFailed()){
completable.CompleteException(result.getFailure());
}否则{
完成(结果);
}
});

但是,您是对的,这可以由
HttpClient
本身完成。跟踪。

我一直在jetty client 9.4.x中使用此功能

var completable = new CompletableFuture<ContentResponse>();
client
  .newRequest(uri)
  .send(new CompletableFutureResponseListener(completable));
var completable=new CompletableFuture();
客户
.newRequest(uri)
.发送(新的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);
    }
  }
}
公共类CompletableFutureResponseListener扩展了BufferingResponseListener{
私人最终可完成未来可完成;
公共完全未来响应侦听器(
可完成(未来可完成){
this.completable=可完成;
}
@凌驾
未完成的公共无效(结果){
if(result.isFailed()){
completable.CompleteException(result.getFailure());
}否则{
var响应=
新的HttpContentResponse(
result.getResponse(),
getContent(),
getMediaType(),
getEncoding());
可完成。完成(响应);
}
}
}

我一直在jetty client 9.4.x中使用此功能

var completable = new CompletableFuture<ContentResponse>();
client
  .newRequest(uri)
  .send(new CompletableFutureResponseListener(completable));
var completable=new CompletableFuture();
客户
.newRequest(uri)
.发送(新的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);
    }
  }
}
公共类CompletableFutureResponseListener扩展了BufferingResponseListener{
私人最终可完成未来可完成;
公共完全未来响应侦听器(
可完成(未来可完成){
this.completable=可完成;
}
@凌驾
未完成的公共无效(结果){
if(result.isFailed()){
completable.CompleteException(result.getFailure());
}否则{
var响应=
新的HttpContentResponse(
result.getResponse(),
getContent(),
getMediaType(),
getEncoding());
可完成。完成(响应);
}
}
}

如果我错了,请纠正我,但我认为此选项不会返回响应正文。我们需要更复杂一点,才能在不阻塞的情况下返回
ContentResponse
。是的,但是当您设置请求来处理内容时,您可以添加
Response.ContentListener
。如果我错了,请纠正我,但我认为此选项不会返回响应正文。我们需要更复杂一点,以便在不阻塞的情况下返回
ContentResponse
。正确,但您可以在设置请求以处理内容时添加
Response.ContentListener