代码之家  ›  专栏  ›  技术社区  ›  Stepan Yakovenko

如何等待HttpURLConnection完成?

  •  0
  • Stepan Yakovenko  · 技术社区  · 6 年前

    如果我将100K文件上传到我服务的某个url,wget需要约20秒才能完成:

    wget --quiet --post-file data.txt --output-document - --header "Content-Type: text/csv" http://localhost:8080/ingest
    

                    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();
    

    所以我的猜测是,实际上这段代码并不是在等待提交数据,而是在后台完成的。如何强制它阻塞,直到实际数据传输完成?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Stephen C    6 年前

    那个密码 应该 等待响应完成。这个 con.getResponseCode() 呼叫不会(不能!)返回,直到服务器至少用包含响应代码的HTTP应答头进行了响应。

    也有可能服务器响应不是2xx响应,并且在错误流而不是输入流上存在服务器错误消息/诊断(阅读上的javadocs getInputStream getErrorStream .)

    所以最有可能的原因是因为请求失败了。。。由于服务器端或客户端的实现问题,没有正确地报告这一情况。


    更新 -事实证明,真正的问题是“curl”在某些平台上的行为异常,可能是由于网络配置问题。