我有一个InputStream
和要输出的数据大小(http请求的响应)。由于空间复杂的原因,我不能阅读整个事情。我想要的是将数据直接发送到一个新的请求主体。我试过用okhttp做这个,但我不能让它工作。我不知道还有其他的http客户端可以做到这一点。
如果可能的话,我想尽量避免和Socket
混在一起。有什么建议吗?
编辑:附加的限制是解决方案必须使用Java8
最佳答案
我相信java 11中新的标准化HttpClient
应该能让您做到这一点。它使用Flow
api(reactive streams),您可以提供一个BodyHandler
/BodySubscriber
来请求/接收字节。HttpClient
还允许您在发送请求时指定BodyPublisher
。因此,这应该只是将请求发布者转发的订阅绑定到其订阅服务器,绑定到http堆栈分发给BodySubscriber
的订阅服务器,然后让BodySubscriber
的onNext
调用Publisher
的订阅服务器对应的方法。
注意,这是一个学术描述:我实际上并没有尝试实现它。设置订阅链接可能需要一些思考和技巧,但我相信它应该可以工作。
但是,请确保BodySubscriber
/BodyPublisher
的实现遵循反应流语义,并且它们不会在回调中阻塞。
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)