我有一个 InputStream
和将要输出的数据的大小(HTTP 请求的响应)。出于空间复杂性的原因,我无法阅读全部内容。我想要的是将数据直接发送到新的请求正文中。我试过用 OkHttp 这样做,但我无法让它工作。我不知道有任何其他 HTTP 客户端可以执行此操作。
如果可能的话,我想避免乱用 Socket
。有什么建议吗?
编辑:添加的限制是该解决方案必须与 Java 8 一起使用
最佳答案
我相信 Java 11 中标准化的新 HttpClient
应该可以让您这样做。它使用 Flow
API( react 流),您可以提供 BodyHandler
/BodySubscriber
来请求/接收字节。 HttpClient
还允许您在发送请求时指定一个 BodyPublisher
。所以这应该只是将请求发布者转发给它的订阅者的订阅绑定(bind)到 Http 堆栈分发给 BodySubscriber
的订阅,然后让 BodySubscriber
的 onNext
(等等)调用 Publisher
的订阅者对应的方法。
请注意,这是一个学术描述:我实际上并没有尝试实现它。设置订阅链接可能需要一些思考和一些技巧,但我相信它应该有效。
但请确保您的 BodySubscriber
/BodyPublisher
实现符合 react 流语义 - 并且它们不会阻塞回调。
https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpClient.html https://openjdk.java.net/groups/net/httpclient/intro.html
再想一想,也许这不是您要问的:如果您已经有一个 InputStream
,那就更简单了:发送请求时只需使用 BodyPublishers.ofInputStream
。
关于java - 如何使用 Java 流式传输 HTTP 请求的主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54553356/