了解Java中的HTTP请求。我想知道阅读响应体是否对保持连接至关重要。
下面是一个示例代码块(将消息发布到某个URL(:
private void writeToConnection(String url, String msg) throws IOException {
try {
HttpURLConnection connection = open(url);
// "Try with resources"
try (BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(connection.getOutputStream()))) {
writer.write(msg);
}
// Why do I need this line?
IOUtils.readStringFromStream(connection.getInputStream());
int code = connection.getResponseCode();
System.out.println(String.format("Returned response code %d.", code));
} catch (IOException e) {
e.printStackTrace();
}
}
为什么有必要读取输入流?方法readStringFromStream
正在返回一个字符串,但该字符串没有被分配给任何内容。这能确保连接保持活动状态吗?如果是,当方法中的第一行打开新连接时,连接如何保持活动?如果下一批要编写的数据调用了这个方法,难道不会放弃旧的连接并打开一个新的连接吗?
我相信这段代码的目的确实是使用响应体,以便可以重用连接。然而,我不确定这种方法是否正确;它也可能取决于您使用的Java版本。
首先,获取连接的InputStream
并关闭它就足够了;在后台,仍然需要读取正文,但关闭流会向连接处理程序发出信号,表明应用程序希望跳过正文,并且处理程序可以在将连接放入缓存以供重用之前读取并丢弃内容。
但是,根据状态的不同,可能存在错误流而不是输入流。即使在这种情况下,在重新使用连接之前,也需要消耗主体,但许多应用程序(如本应用程序(并不需要读取错误消息的主体。然而,由于Java7,如果错误体足够小,它将被自动消耗和缓冲。
在后台,连接缓存用于保留打开的连接。尽管方法名称表明每次都会打开一个新连接,但事实上,首先会检查缓存中是否有打开的连接。