软件包  jdk.incubator.http

Interface HttpResponse.MultiProcessor<U,T>

  • 参数类型
    U - 表示聚合结果的类型
    T - 表示所有响应体的类型
    Enclosing class:
    HttpResponse < T >


    public static interface HttpResponse.MultiProcessor<U,T>
    用于HTTP / 2多响应的响应处理器。
    Incubating Feature.将在以后的版本中删除。

    多重响应包括主要响应和零个或多个附加响应。 每个额外的响应由服务器响应服务器也生成的请求发送。 其他响应通常是服务器期望客户端需要哪些与初始请求相关的资源。

    注意。 应用程序应该考虑首先使用MultiProcessor.asMap()提供的机制(建立在此界面上),这是一个略微简化但通用的界面。

    服务器生成的请求也称为推送承诺 允许服务器发送任何数量的这些请求直到完全收到主响应的点。 因此,在完成主要响应之后,已知附加响应的最终数量。 可以取消额外的响应,但是由于服务器在发送响应之前不等待任何确认,所以必须快速完成,以避免不必要的数据传输。

    MultiProcessor的参数化类型为U ,表示收到的响应的一些有意义的汇总。 这通常是响应或响应体对象的集合。

    从以下版本开始:
    9
    • 方法详细信息

      • onRequest

        Optional<HttpResponse.BodyHandler<T>> onRequest​(HttpRequest request)
        被称为主要请求和每个推送承诺。 第一个呼叫将始终是由主叫方发送的主要请求。 HttpRequest参数表示初始请求或后续PUSH_PROMISE。 执行必须返回OptionalHttpResponse.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 - 为每个请求或推送承诺调用的函数
        结果
        一个多处理器