我有一个InputStream
和要输出的数据大小(HTTP请求的响应)。由于篇幅复杂的原因,我无法阅读全部内容。我想要的是将数据直接发送到新的请求正文中。我尝试使用OkHttp进行此操作,但无法正常工作。我不知道可以执行此操作的任何其他HTTP客户端。
如果可能的话,我想避免与Socket
混为一谈。有什么建议吗?
编辑:增加的限制是该解决方案必须与Java 8配合使用
答案 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
。
答案 1 :(得分:0)
我想补充一点,如果请求的大小足够您想要实现流式传输,那么接收服务很可能也希望实现流式传输。
虽然较旧的现有 HttpUrlConnection 类或任何提供对与给定 Url 连接关联的输入和输出流的访问权限的类都可以支持流式传输,但您也可能必须编写过多的支持用于更新的安全问题,例如 OPTIONS。