java - 如何等到 HttpURLConnection 完成?
问题描述
如果我将 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();
所以我的猜测是,实际上这段代码不是在等待数据提交,而是在后台执行此操作。如何强制它阻塞,直到实际数据传输完成?
解决方案
该代码应该等待响应完成。con.getResponseCode()
在服务器至少响应包含响应代码的 HTTP 回复标头之前,该调用不会(不能!)返回。
可能是服务器在完成读取客户端发布的数据之前发送了 HTTP 回复标头。那将是一个错误。(如果服务器发送响应过快,将无法正确设置响应码!)
服务器响应也可能不是 2xx 响应,并且错误流而不是输入流上有服务器错误消息/诊断。(阅读getInputStream
vs上的 javadocs getErrorStream
。)
因此,没有阻塞约 20 秒的最可能原因是请求失败......并且由于服务器或客户端实现问题而没有正确报告。
更新- 事实证明,真正的问题是“curl”在某些平台上表现异常,可能是由于网络配置问题。
推荐阅读
- html - HTML 输出加载和显示滚动条的时间过长
- magento - 在页面加载时获取数据库查询日志
- react-native - 如何使用 eslint 设置内联样式规则?
- discord.py - discord.py 如何使用 client.login 而不是 client.run
- r - 如何使列中的值成为具有相应值的单独列?
- python - python, mongo and marshmallow: datetime struggles
- sql - SQL Server 客户端字符串到(强制)整数转换问题
- python - 如何将我的模拟刷新到开始?
- android - 为什么模拟器中没有显示格式化文本
- c++ - 我们不能在 C++ 中声明模板成员吗?