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请求消息后才响应。