我无法理解为什么以下代码没有将数据包放到线路上(通过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
会被延迟。套接字上没有其他流量。
答案 0 :(得分:6)
除非您使用固定长度或分块传输模式,否则HttpURLConnection
将缓冲您的所有输出,直到您拨打getInputStream()
或getResponseCode()
,以便它可以发送正确的内容长度标题。
如果你致电getResponseCode()
,你应该看一下它的价值。