如果我将100K文件上传到我的服务的某些网址,则wget大约需要20秒才能完成:
wget --quiet --post-file data.txt --output-document - --header "Content-Type: text/csv" http://localhost:8080/ingest
但是如果我在Java中这样做,很奇怪,这会立即发生:
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "text/csv;charset=UTF-8");
con.setDoOutput(true);
OutputStream outputStream = con.getOutputStream();
outputStream.write(str.getBytes("UTF-8"));
outputStream.flush();
outputStream.close();
System.out.println("code=" + con.getResponseCode());
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
所以我的猜测是,这段代码实际上不是在等待数据提交,而是在后台执行。如何强制它阻塞直到实际数据传输完成?
答案 0 :(得分:0)
该代码应该正在等待响应完成。直到服务器至少响应了包含响应代码的HTTP答复标头,$1
调用才会(无法!)返回。
可能是服务器在完成读取客户端发布的数据之前正在发送HTTP答复标头。那将是一个错误。 (如果服务器发送响应太早,则无法正确设置响应代码!)
服务器响应也可能不是2xx响应,并且在错误流而不是输入流上有服务器错误消息/诊断。 (请阅读con.getResponseCode()
和getInputStream
上的javadocs。)
所以大约20秒钟之内没有阻塞的最可能原因是因为请求失败...并且由于服务器或客户端实施问题而未正确报告此消息。
更新-事实证明,真正的问题是“ curl”在某些平台上的行为异常,可能是由于网络配置问题造成的。