使用Java 11 HttpClient将流响应主体转换为流请求主体

时间:2019-08-07 15:35:35

标签: java http publish-subscribe java-11 java-http-client

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

我已经通过创建自己的发布服务器(在POST中使用该发布服务器来编写请求正文),对Java 11中的HttpClient进行了同样的处理。 GET请求具有一个BodyHandler和一个ofByteArrayConsumer,它们将这些块发送到自定义发布者,然后该发布者本身将这些块发送到订阅HTTP POST请求。

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

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

我是否想念这里的内容以便能够将BodyPublisher从一个请求连接到另一个请求?

1 个答案:

答案 0 :(得分:2)

您什么都不丢失。这只是一个用例,目前尚不支持。尽管从ByteBufferList<ByteBuffer>的映射是微不足道的,但逆映射却并非如此。一种简单(如果不是最佳)的方法可以将列表中的所有缓冲区收集到单个缓冲区中-如果要控制数量,可以将HttpResponse.BodyHandlers.ofPublisher()HttpResponse.BodyHandlers.buffering()组合在一起您从上游收到的每个发布的List<ByteBuffer>中的字节数。