我有一个InputStream和要输出的数据大小(http请求的响应)。由于空间复杂的原因,我不能阅读整个事情。我想要的是将数据直接发送到一个新的请求主体。我试过用okhttp做这个,但我不能让它工作。我不知道还有其他的http客户端可以做到这一点。
如果可能的话,我想尽量避免和Socket混在一起。有什么建议吗?
编辑:附加的限制是解决方案必须使用Java8

最佳答案

我相信java 11中新的标准化HttpClient应该能让您做到这一点。它使用Flowapi(reactive streams),您可以提供一个BodyHandler/BodySubscriber来请求/接收字节。HttpClient还允许您在发送请求时指定BodyPublisher。因此,这应该只是将请求发布者转发的订阅绑定到其订阅服务器,绑定到http堆栈分发给BodySubscriber的订阅服务器,然后让BodySubscriberonNext调用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)

10-06 12:47
查看更多