使用 java 11 HttpClient 将响应主体流式传输到流式请求主体

streaming response body to a streaming request body with java 11 HttpClient

我正在尝试将数据从 HTTP (GET) 响应流式传输到另一个 HTTP (POST) 请求。使用旧的 HttpURLConnection,我将获取响应 OutputStream,将部分读入缓冲区并将它们写入请求 InputStream。

我已经设法在 Java 11 中对 HttpClient 执行相同的操作,方法是创建我自己的 Publisher,该 Publisher 在 POST 中用于编写请求正文。 GET 请求有一个 BodyHandlerofByteArrayConsumer,它将块发送到自定义发布者,然后它自己将块发送到订阅 HTTP POST 请求。

但我认为这不是正确的方法,因为看起来 API 中有些东西看起来可以直接完成而无需我自己实现发布者和订阅者。

HttpResponse.BodyHandlers.ofPublisher() 其中 returns 和 Publisher<List<ByteBuffer> 我可以用于 HTTP GET 请求。不幸的是,对于我的 POST 请求,有 HttpRequest.BodyPublishers.fromPublisher 需要 Publisher<? extends ByteBuffer> 所以似乎 fromPublisher 只适用于持有完整 ByteBuffer 而不是发送多个 ByteBuffers 的发布者的数据。

我是否错过了能够将 BodyPublisher 从一个请求连接到另一个请求的东西?

你没有遗漏任何东西。这只是一个目前不支持开箱即用的用例。尽管从 ByteBufferList<ByteBuffer> 的映射是微不足道的,但逆映射却不那么简单。从一个适应另一个的一种简单(如果不是最佳)方法可能是将列表中的所有缓冲区收集到一个缓冲区中——如果你想控制数量,可能将 HttpResponse.BodyHandlers.ofPublisher()HttpResponse.BodyHandlers.buffering() 结合起来您从上游收到的每个已发布 List<ByteBuffer> 中的字节数。