为什么读取HTTP请求的响应主体很重要



了解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,如果错误体足够小,它将被自动消耗和缓冲。

在后台,连接缓存用于保留打开的连接。尽管方法名称表明每次都会打开一个新连接,但事实上,首先会检查缓存中是否有打开的连接。

最新更新