如果我将100K文件上传到我的服务的某个url,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();
所以我的猜测是,实际上这段代码并不是在等待数据提交,而是在后台完成这项工作。在实际数据传输完成之前,我如何强制它阻塞?
发布于 2018-10-11 08:15:50
该代码应该等待响应完成。con.getResponseCode()
调用不会(不能!)返回,直到服务器至少使用包含响应代码的HTTP回复标头进行了响应。
可能是服务器在读取完客户端发布的数据之前发送了HTTP回复报头。那将是一个错误。(如果服务器发送响应太快,它将无法正确设置响应代码!)
也有可能服务器响应不是2xx响应,并且错误流而不是输入流上有服务器错误消息/诊断信息。(请阅读getInputStream
与getErrorStream
上的javadoc。)
所以最有可能的原因是大约20秒内没有阻塞,因为请求失败了……由于服务器或客户端的实现问题,没有正确地报告这一点。
更新-事实证明,真正的问题是"curl“在某些平台上行为异常,可能是由于网络配置问题。
https://stackoverflow.com/questions/52750332
复制相似问题