下面的代码
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
消息“服务器返回 HTTP 响应代码: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 合同中看到这一点。即它应该写在某个地方,直到写一些东西我才能生成输入流。在任何情况下,实现都可以允许这样做,只是迫使该流的读者等待。