Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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 如果在写入连接之前获取InputStream,则会发生错误500_Java_Http_Httprequest_Httpurlconnection - Fatal编程技术网

Java 如果在写入连接之前获取InputStream,则会发生错误500

Java 如果在写入连接之前获取InputStream,则会发生错误500,java,http,httprequest,httpurlconnection,Java,Http,Httprequest,Httpurlconnection,下面的代码 OutputStream outputWeb = conn.getOutputStream(); File file = new File("myfile"); InputStream inputFile = new FileInputStream(file); InputStream inputWeb = conn.getInputStream(); while((ch=inputFile.read()) >= 0) { outputWeb

下面的代码

OutputStream outputWeb = conn.getOutputStream();

File file = new File("myfile");
InputStream inputFile = new FileInputStream(file);

InputStream inputWeb = conn.getInputStream();           

while((ch=inputFile.read()) >= 0) {
    outputWeb.write(ch);
}
导致
IOException
,消息“Server returned HTTP response code:500 for URL:myurl”就在从连接获取InputStream的行上

而下面的代码不会导致任何异常,工作正常

OutputStream outputWeb = conn.getOutputStream();

File file = new File("myfile");
InputStream inputFile = new FileInputStream(file);

while((ch=inputFile.read()) >= 0) {
    outputWeb.write(ch);
}

InputStream inputWeb = conn.getInputStream();
唯一的区别是,在对连接进行一些写入之后获取位于其中的输入流

如何从API合同中推断出这一点?发生了什么,为什么

连接配置

URL url = new URL("https://myurl");
HttpURLConnection conn;

// creating http connection 
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("Content-type", "audio....");
更新


原则上现在已经很清楚了,但我仍然希望在API合同中看到这一点。也就是说,它应该写在某个地方,在写东西之前我不能生成输入流。在任何情况下,实现都可以允许这样做,只是强制该流的读者等待

一个很好的答案来解释这是为什么发生的以及如何绕过它(你已经知道):你可能想考虑<代码>公钥IO/<代码>库和<代码> IouTIL.Simulink(输入流,OutputStream)< /C>方法,而不是逐字节复制内容,这可能是非常低效的。那个服务器在我完成发布之前回答了什么?例如,不可能使HTTP转换器在发送时使用部分数据进行响应?规范不禁止使用@Dims。但大多数客户端是单线程的,在写入整个请求之前,它们不会开始读取响应。因此,服务器不能冒险在请求耗尽之前进行响应;除非它知道客户机正在同时阅读。另一个机制是继续;它也没有在客户端中广泛实现。@不可更改-RFC 2616的第6节明确指出,服务器只应在读取和解释HTTP请求消息后才响应。