Как я могу транслировать тело HTTP-запроса, используя Java - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть InputStream и размер данных, которые будут выходить (ответ HTTP-запроса).По причинам сложности пространства я не могу прочитать все это.Я хочу отправить данные прямо в новое тело запроса.Я пытался сделать это с OkHttp, но я не могу заставить его работать.Я не знаю ни одного другого HTTP-клиента, который мог бы сделать это.

Если это вообще возможно, я бы хотел избежать возни с Socket.Любой совет?

Редактировать: добавлено ограничение, что решение должно работать с Java 8

1 Ответ

0 голосов
/ 06 февраля 2019

Я полагаю, что новый 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...