Я полагаю, что новый HttpClient
, стандартизированный в Java 11, должен позволить вам сделать это.Он использует Flow
API (реактивные потоки), и вы можете предоставить BodyHandler
/ BodySubscriber
, который будет запрашивать / получать байты по мере их поступления.HttpClient
также позволяет вам указать BodyPublisher
при отправке запроса.Таким образом, следует лишь связать подписку, отправляемую издателем запросов своим подписчикам, с подпиской, выданной BodySubscriber
стеком Http, и затем иметь 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)