如何使用Java流式传输HTTP请求的正文

时间:2019-02-06 12:10:35

标签: java http streaming

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

如果可能的话,我想避免与Socket混为一谈。有什么建议吗?

编辑:增加的限制是该解决方案必须与Java 8配合使用

2 个答案:

答案 0 :(得分:0)

我相信Java 11中标准化的新HttpClient应该能让您做到这一点。它使用Flow API(反应流),并且您可以提供BodyHandler / BodySubscriber来请求/接收字节。 HttpClient还可以让您在发送请求时指定BodyPublisher。因此,这仅是将请求发布者转发给其订阅者的订阅,由Http堆栈分发给BodySubscriber的订阅,然后将BodySubscriber的{​​{1 }}(等等)调用onNext的订户对应方法。 请注意,这是一个学术性的描述:我实际上并没有尝试实现它。建立订阅链接可能需要一些思考和技巧,但是我认为它应该可以工作。

但是请确保您的Publisher / BodySubscriber的实现遵守反应流的语义-并且它们不会在回调中阻塞。

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

再三考虑也许不是您要问的:如果您已经拥有BodyPublisher,那就更简单了:发送请求时只需使用InputStream

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

答案 1 :(得分:0)

我想补充一点,如果请求的大小足够您想要实现流式传输,那么接收服务很可能也希望实现流式传输。

虽然较旧的现有 HttpUrlConnection 类或任何提供对与​​给定 Url 连接关联的输入和输出流的访问权限的类都可以支持流式传输,但您也可能必须编写过多的支持用于更新的安全问题,例如 OPTIONS。