如何从 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);
}
}
}
是否可以使用 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);
}
}
}