除非我尝试接收某些内容,否则为什么HttpURLConnection不会发送数据

时间:2014-11-07 18:55:05

标签: java http httpurlconnection

我无法理解为什么以下代码没有将数据包放到线路上(通过wireshark确认)。我认为,这是一种发送HTTP POST请求的相当标准的方法。我不打算只阅读POST

private void sendRequest() throws IOException {
    String params = "param=value";
    URL url = new URL(otherUrl.toString());
    HttpURLConnection con = (HttpURLConnection)url.openConnection();
    con.setDoOutput(true);
    con.setDoInput(true);    //setting this to `false` does not help
    con.setRequestMethod("POST");
    con.setRequestProperty("Content-Type", "text/plain");
    con.setRequestProperty("Content-Length", "" + Integer.toString(params.getBytes().length));
    con.setRequestProperty("Accept", "text/plain");
    con.setUseCaches(false);
    con.connect();
    DataOutputStream wr = new DataOutputStream(con.getOutputStream());
    wr.writeBytes(params);
    wr.flush();
    wr.close();
    //Logger.getLogger("log").info("URL: "+url+", response: "+con.getResponseCode());
    con.disconnect();
}

除非我尝试阅读任何内容,否则实际上什么都没有。例如,通过取消注释读取响应代码的上述日志行。尝试通过con.getInputStream();阅读回复也有效。数据包没有移动。当我取消注释getResponseCode时,我会看到发送了http POST,然后发回200 OK。订单是正确的。即在发送POST之前,我没有得到一些疯狂的回应。其他一切看起来完全一样(如果需要,我可以附上wireshark截图)。在调试器中代码执行(即不阻塞任何地方)。

我不明白在什么情况下会发生这种情况。我相信应该可以通过POST发送con.setDoInput(false);请求。目前它没有发送任何内容或失败(当试图执行con.getResponseCode()时)有异常,因为我显然承诺我不会读任何东西。

可能相关,在sendRequest之前我确实要求来自同一网站的一些数据,但我相信我会正确地关闭所有数据。即:

public static String getData(String urlAddress) throws MalformedURLException, IOException {
    URL url = new URL(urlAddress);
    HttpURLConnection con = (HttpURLConnection)url.openConnection();
    con.setDoOutput(false);
    InputStream in = con.getInputStream(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    StringBuilder data = new StringBuilder();
    String line;
    while((line = reader.readLine()) != null) {
        data.append(line);
    }
    reader.close();
    in.close();
    con.getResponseCode();
    con.disconnect();
    return data.toString();
}

两种情况下url的服务器都是相同的端口,所以我相信可以使用相同的套接字进行通信。上面的代码可以正常工作和检索数据。

我不确定,也许我不会清理某些东西,并且它会被缓存,所以如果没有明确的阅读,POST会被延迟。套接字上没有其他流量。

1 个答案:

答案 0 :(得分:6)

除非您使用固定长度或分块传输模式,否则HttpURLConnection将缓冲您的所有输出,直到您拨打getInputStream()getResponseCode(),以便它可以发送正确的内容长度标题。

如果你致电getResponseCode(),你应该看一下它的价值。