java - 使用 java 11 HttpClient 将响应主体流式传输到流式请求主体
问题描述
我正在尝试将来自 HTTP (GET) 响应的数据流式传输到另一个 HTTP (POST) 请求。使用旧的 HttpURLConnection,我将获取响应 OutputStream,将部分读入缓冲区并将它们写入请求 InputStream。
我已经设法在 Java 11 中对 HttpClient 做同样的事情,方法是创建我自己的 Publisher,在 POST 中使用它来编写请求正文。GET 请求有一个BodyHandler
withofByteArrayConsumer
将块发送到自定义发布者,然后它自己将块发送到订阅 HTTP POST 请求。
但我认为这不是正确的方法,因为看起来 API 中有一些东西看起来可以直接完成,而无需自己实现发布者和订阅者。
有HttpResponse.BodyHandlers.ofPublisher()
一个返回一个Publisher<List<ByteBuffer>
我可以用于 HTTP GET 请求的。不幸的是,对于我的 POST 请求,HttpRequest.BodyPublishers.fromPublisher
它需要一个Publisher<? extends ByteBuffer>
,所以似乎 fromPublisher 仅适用于拥有完整 ByteBuffer 的发布者,而不适用于为部分数据发送多个 ByteBuffer 的发布者。
我是否错过了一些能够将 BodyPublisher 从一个请求连接到另一个请求的东西?
解决方案
你没有错过任何东西。这只是一个目前不支持开箱即用的用例。虽然从ByteBuffer
to的映射List<ByteBuffer>
是微不足道的,但逆映射就不那么重要了。从一个到另一个适应的一种简单(如果不是最佳)方法可能是将列表中的所有缓冲区收集到一个缓冲区中 -如果您想控制从上游接收的每个已发布的字节数,可能会结合HttpResponse.BodyHandlers.ofPublisher()
使用.HttpResponse.BodyHandlers.buffering()
List<ByteBuffer>
推荐阅读
- r - 带有ggplot的直方图中的Y轴比例
- python-3.x - Lambda 在 2019 年 1 月 12 日 01:00 失去与 RDS 的连接(欧盟/伦敦)
- node.js - 在响应 node.js Mongoose 中仅发送对象的一个属性
- r - 控制 ggplot 图的大小以匹配第二个图
- python - 创建一个只有message.author才能看到python的频道
- c# - C# 共享属性和字段继承
- bash - 拆分文件并为新拆分的文件指定特定名称
- node.js - 使用 NodeJS(服务器端)从另一个账户访问 AWS Cognito 池
- api - 用于 Visual Studio 代码的 API
- applescript - 更改文件在 Finder 中的排序方式