Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java 11 HttpClient将流响应主体传输到流请求主体_Java_Http_Publish Subscribe_Java 11_Java Http Client - Fatal编程技术网

使用java 11 HttpClient将流响应主体传输到流请求主体

使用java 11 HttpClient将流响应主体传输到流请求主体,java,http,publish-subscribe,java-11,java-http-client,Java,Http,Publish Subscribe,Java 11,Java Http Client,我正在尝试将数据从HTTP(GET)响应流传输到另一个HTTP(POST)请求。使用旧的HttpURLConnection,我将接收响应OutputStream,将部分读入缓冲区,并将它们写入请求InputStream 我已经在Java11中通过创建我自己的发布服务器来使用HttpClient实现了同样的功能,该发布服务器在文章中用于编写请求主体。GET请求有一个BodyHandler,带有of ByteArrayConsumer,它将块发送到自定义发布服务器,然后自定义发布服务器本身将块发送到

我正在尝试将数据从HTTP(GET)响应流传输到另一个HTTP(POST)请求。使用旧的HttpURLConnection,我将接收响应OutputStream,将部分读入缓冲区,并将它们写入请求InputStream

我已经在Java11中通过创建我自己的发布服务器来使用HttpClient实现了同样的功能,该发布服务器在文章中用于编写请求主体。GET请求有一个
BodyHandler
,带有
of ByteArrayConsumer
,它将块发送到自定义发布服务器,然后自定义发布服务器本身将块发送到订阅HTTP POST请求

但我认为这不是正确的方法,因为API中似乎有某种东西可以直接实现,而无需自己实现发布者和订阅者


有一个
HttpResponse.BodyHandlers.ofPublisher()
,它返回一个
Publisher您没有遗漏任何东西。这只是一个目前还不支持的用例。虽然从
ByteBuffer
List
的映射很简单,但是反向映射就不那么简单了。从一个缓冲区到另一个缓冲区的一种简单(如果不是最佳)方法是将列表中的所有缓冲区收集到一个缓冲区中-可能将
HttpResponse.BodyHandlers.ofPublisher()
HttpResponse.BodyHandlers.buffering()相结合
如果您想控制从上游接收到的每个已发布的
列表中的字节数。

我还得出结论,该API适用于从HTTP流流入或流出到其他已启用反应的代码,但它似乎不是设计用于另一个HTTP调用。因此,很容易将Body*(BodyPublisher等)与普通*(Publisher等)结合起来,但不能将Body*与Body*结合起来,因为它们是非常特殊的发布者,等等。我已切换到在两个调用中使用“of Inputstream”,并将响应Inputstream提供给请求发布者。到目前为止,这工作非常顺利,除了两件事:如果在读取流时发生任何异常,我找不到处理任何错误的方法,因为sendAsync future在处理标头之后立即完成,并且在这之后完全没有声音(甚至没有stacktrace sysout)。另一件事是,我没有找到一种方法来检查调用是否完全完成(除了包装输入流并检查HttpClient是否已调用close)。您能详细说明错误处理吗?如果从流中读取时出错,则sendAsync返回的完全未来应该异常完成。如果不是,那就是一个bug。但是,请注意,如果数据不立即可用,则使用ofInputStream()会在异步代码中混合使用阻塞(同步)代码。也就是说,当sendAsync尝试发送请求正文时,它将阻塞,直到收到请求的数据并将其移交给InputStream。我认为这不是一个bug。读取标头后,syndAsync立即完成。JavaDoc中也描述了这一点。所以我认为这种不良行为是故意的。您可以通过包装inputStream并在read()中引发异常来尝试。future.get()将为您提供inputStream和response对象,其中statucs代码为200,标头在那里。另外,futures.handle方法也将走向成功,因为它不关心有人对输入流做了什么。因此,我认为没有机会处理HTTP头之后发生的错误。
HttpRequest.bodypublisher.ofInputStream的实现将
IOException
视为
EOF
。这充其量是有问题的——它可能应该在订阅服务器上调用onError()。(记录为JDK-8229703)