1

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

我已经设法在 Java 11 中对 HttpClient 做同样的事情,方法是创建我自己的 Publisher,在 POST 中使用它来编写请求正文。GET 请求有一个BodyHandlerwithofByteArrayConsumer将块发送到自定义发布者,然后它自己将块发送到订阅 HTTP POST 请求。

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

HttpResponse.BodyHandlers.ofPublisher()一个返回一个Publisher<List<ByteBuffer>我可以用于 HTTP GET 请求的。不幸的是,对于我的 POST 请求,HttpRequest.BodyPublishers.fromPublisher它需要一个Publisher<? extends ByteBuffer>,所以似乎 fromPublisher 仅适用于拥有完整 ByteBuffer 的发布者,而不适用于为部分数据发送多个 ByteBuffer 的发布者。

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

4

1 回答 1

3

你没有错过任何东西。这只是一个目前不支持开箱即用的用例。虽然从ByteBufferto的映射List<ByteBuffer>是微不足道的,但逆映射就不那么重要了。从一个到另一个适应的一种简单(如果不是最佳)方法可能是将列表中的所有缓冲区收集到一个缓冲区中 -如果您想控制从上游接收的每个已发布的字节数,可能会结合HttpResponse.BodyHandlers.ofPublisher()使用.HttpResponse.BodyHandlers.buffering()List<ByteBuffer>

于 2019-08-08T13:29:09.117 回答