java - 如何使用 Java 流式传输 HTTP 请求的主体

标签 java http streaming

我有一个 InputStream 和将要输出的数据的大小(HTTP 请求的响应)。出于空间复杂性的原因,我无法阅读全部内容。我想要的是将数据直接发送到新的请求正文中。我试过用 OkHttp 这样做,但我无法让它工作。我不知道有任何其他 HTTP 客户端可以执行此操作。

如果可能的话,我想避免乱用 Socket。有什么建议吗?

编辑:添加的限制是该解决方案必须与 Java 8 一起使用

最佳答案

我相信 Java 11 中标准化的新 HttpClient 应该可以让您这样做。它使用 Flow API( react 流),您可以提供 BodyHandler/BodySubscriber 来请求/接收字节。 HttpClient 还允许您在发送请求时指定一个 BodyPublisher。所以这应该只是将请求发布者转发给它的订阅者的订阅绑定(bind)到 Http 堆栈分发给 BodySubscriber 的订阅,然后让 BodySubscriberonNext(等等)调用 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

https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpRequest.BodyPublishers.html#ofInputStream(java.util.function.Supplier)

关于java - 如何使用 Java 流式传输 HTTP 请求的主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54553356/

相关文章:

java - 数组空指针异常错误

用于匹配目录和文件的 Java Globbing 模式

java - gridbaglayout垂直间隙

java - 了解 HashMap 和 IdentityHashMap

c# - IsWebSocketRequest 不能在单声道中工作

scala - POST方法请求Http4s的正确处理方式

http - Nginx proxy_cache_key $request_body 被大请求体忽略

c++ - 为每个新客户端提取 GStreamer 和 URI 查询参数

python - 您可以使用 ffmpeg 流从文件实时插入文本吗?

WCF REST 流式传输保持事件连接