-
- 参数类型
-
U
- 表示聚合结果的类型 -
T
- 表示所有响应体的类型
- Enclosing class:
- HttpResponse < T >
public static interface HttpResponse.MultiProcessor<U,T>
用于HTTP / 2多响应的响应处理器。
Incubating Feature.将在以后的版本中删除。多重响应包括主要响应和零个或多个附加响应。 每个额外的响应由服务器响应服务器也生成的请求发送。 其他响应通常是服务器期望客户端需要哪些与初始请求相关的资源。
注意。 应用程序应该考虑首先使用
MultiProcessor.asMap()
提供的机制(建立在此界面上),这是一个略微简化但通用的界面。服务器生成的请求也称为推送承诺 。 允许服务器发送任何数量的这些请求直到完全收到主响应的点。 因此,在完成主要响应之后,已知附加响应的最终数量。 可以取消额外的响应,但是由于服务器在发送响应之前不等待任何确认,所以必须快速完成,以避免不必要的数据传输。
MultiProcessor
的参数化类型为U
,表示收到的响应的一些有意义的汇总。 这通常是响应或响应体对象的集合。- 从以下版本开始:
- 9
-
-
方法摘要
所有方法 静态方法 接口方法 抽象方法 Default Methods Modifier and Type 方法 描述 static <V> HttpResponse.MultiProcessor<MultiMapResult<V>,V>
asMap(Function<HttpRequest,Optional<HttpResponse.BodyHandler<V>>> pushHandler)
返回多个响应的通用处理程序。static <V> HttpResponse.MultiProcessor<MultiMapResult<V>,V>
asMap(Function<HttpRequest,Optional<HttpResponse.BodyHandler<V>>> pushHandler, boolean completion)
返回多个响应的通用处理程序。CompletableFuture<U>
completion(CompletableFuture<Void> onComplete, CompletableFuture<Void> onFinalPushPromise)
当聚合结果对象本身可用时,返回CompletableFuture
<U>
。void
onError(HttpRequest request, Throwable t)
如果接收到响应发生错误,则调用。Optional<HttpResponse.BodyHandler<T>>
onRequest(HttpRequest request)
被称为主要请求和每个推送承诺。void
onResponse(HttpResponse<T> response)
呼叫收到的每个响应。
-
-
-
方法详细信息
-
onRequest
Optional<HttpResponse.BodyHandler<T>> onRequest(HttpRequest request)
被称为主要请求和每个推送承诺。 第一个呼叫将始终是由主叫方发送的主要请求。 此HttpRequest
参数表示初始请求或后续PUSH_PROMISE。 执行必须返回Optional
的HttpResponse.BodyHandler
作为响应体。 不同的处理程序(相同类型)可以在同一个多次发送内进行不同的推送。 如果没有返回处理程序(一个空的Optional
),那么推送将被取消。 对于初始(主)请求,不会返回有效的BodyHandler
是错误的。- 参数
-
request
- 主要请求或后续推送承诺 - 结果
- 可选的身体处理程序
-
onResponse
void onResponse(HttpResponse<T> response)
呼叫收到的每个响应。 对于每个请求,onResponse()或onError()之一保证被调用,但不能同时被调用。 [注意]切换到此回调接口而不是使用提供给onRequest()的CompletableFutures的原因在于这些CF和从completion()返回的CF之间存在微妙的交互(或之前称为onComplete())。 在完成onResponse()调用完成的所有工作之后,completion()CF将不会完成。 而如果您刚刚创建CF依赖于提供的CF(对onRequest()),则该实现不具有依赖CF的可见性,并且不能保证在依赖CF之后调用onComplete()(或完成completion()CF)完成。- 参数
-
response
- 收到的回复
-
onError
void onError(HttpRequest request, Throwable t)
如果接收到响应发生错误,则调用。 对于每个请求,onResponse()或onError()之一保证被调用,但不能同时被调用。- 参数
-
request
- 主要请求或后续推送承诺 -
t
- 导致错误的Throwable
-
completion
CompletableFuture<U> completion(CompletableFuture<Void> onComplete, CompletableFuture<Void> onFinalPushPromise)
当聚合结果对象本身可用时,返回一个CompletableFuture
<U>
。 预期返回的CompletableFuture
将取决于给定的CompletableFuture<Void
的一个,它们在与多个响应相关联的所有个人响应已经完成之后完成,或者在所有推送承诺已经被接收之后。- Implementation Note:
-
实现可能遵循下面所示的模式
CompletableFuture<U> completion( CompletableFuture<Void> onComplete, CompletableFuture<Void> onFinalPushPromise) { return onComplete.thenApply((v) -> { U u = ... instantiate and populate a U instance return u; }); }
- 参数
-
onComplete
- 在收到与此多请求相关的所有答复之后完成的CompletableFuture。 -
onFinalPushPromise
- 完成所有推进承诺后完成的完成。 - 结果
- 聚合CF响应对象
-
asMap
static <V> HttpResponse.MultiProcessor<MultiMapResult<V>,V> asMap(Function<HttpRequest,Optional<HttpResponse.BodyHandler<V>>> pushHandler, boolean completion)
返回多个响应的通用处理程序。 此处理程序生成的聚合结果对象是一个Map<HttpRequest,CompletableFuture<HttpResponse<V>>>
。 每个请求(原始用户生成的请求和每个服务器生成的推送承诺)作为地图的关键字返回。 每个键对应的值为CompletableFuture<HttpResponse<V>>
。根据完成参数的值,有两种使用这些处理程序的方法。 如果完成是真的,那么在所有响应自己完成之后,聚合结果将可用。 如果完成是假的,则在收到最后一个推送承诺后,聚合结果将立即可用。 在前一种情况下,这意味着Map中的所有CompletableFutures都将完成。 在后一种情况下,它们可能已经还没有完成。
使用这些处理程序的最简单的方法是将完成设置为
true
,然后Map中的所有(结果)值都可以访问而不阻止。有关使用此接口的代码示例,请参阅
asMap(java.util.function.Function, boolean)
。- 参数类型
-
V
- 用于所有响应的身体类型 - 参数
-
pushHandler
- 为每个请求或推送承诺调用的函数 -
completion
-true
如果聚合CompletableFuture在收到所有响应后完成,或false
在收到所有推送承诺后。 - 结果
- 一个多处理器
-
asMap
static <V> HttpResponse.MultiProcessor<MultiMapResult<V>,V> asMap(Function<HttpRequest,Optional<HttpResponse.BodyHandler<V>>> pushHandler)
返回多个响应的通用处理程序。 这是一个调用asMap(Function, true)
的方便方法,意思是在收到所有响应后,聚合结果对象完成。使用示例
HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://www.foo.com/")) .GET() .build(); HttpClient client = HttpClient.newHttpClient(); Map<HttpRequest,CompletableFuture<HttpResponse<String>>> results = client .sendAsync(request, MultiProcessor.asMap( (req) -> Optional.of(HttpResponse.BodyHandler.asString()))) .join();
该示例中的lambda是最简单的可能的实现,其中既不检查传入请求,也不检查响应头,并且接受服务器发送的每个推送。 当join()调用返回时,所有
HttpResponse
及其关联的身体对象都可用。- 参数类型
-
V
- 用于所有响应的身体类型 - 参数
-
pushHandler
- 为每个请求或推送承诺调用的函数 - 结果
- 一个多处理器
-
-