CloseableHttpResponse类是 Apache HttpClient 库中的一个类,代表一个可关闭的 HTTP 响应。当你使用 HttpClient 发送请求时,你会得到一个 CloseableHttpResponse
实例,它包含了服务器的响应数据和状态。处理完响应后,你应该关闭这个响应对象来释放底层的系统资源。
常用方法
-
获取响应实体:
HttpEntity getEntity()
:返回响应实体,可能包含二进制数据或文本数据。
-
获取状态行:
StatusLine getStatusLine()
:返回响应的状态行,包含 HTTP 版本和状态码。
-
获取所有头信息:
Header[] getAllHeaders()
:返回响应的所有头信息。
-
获取特定的头信息:
Header getFirstHeader(String name)
:返回指定名称的第一个头信息。Header getLastHeader(String name)
:返回指定名称的最后一个头信息。
-
迭代头信息:
HeaderIterator headerIterator()
:返回一个头信息迭代器。HeaderIterator headerIterator(String name)
:返回指定名称的头信息迭代器。
-
关闭响应:
void close()
:关闭响应并释放底层资源。
代码案例
案例 1 :使用 CloseableHttpResponse 获取和处理响应实体。
java
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.HttpEntity;
import org.apache.http.StatusLine;
import org.apache.http.util.EntityUtils;
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://example.com");
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
// 获取状态线对象,可以获取状态码和HTTP版本
StatusLine statusLine = response.getStatusLine();
System.out.println("HTTP version: " + statusLine.getProtocolVersion());
System.out.println("Status code: " + statusLine.getStatusCode());
// 获取响应实体
HttpEntity entity = response.getEntity();
if (entity != null) {
// 将响应实体转换为字符串
String result = EntityUtils.toString(entity);
System.out.println(result);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 确保关闭 httpClient 资源
try {
httpClient.close();
} catch (Exception e) {
e.printStackTrace();
}
}
在这个例子中,我们创建了一个 HttpGet
对象来发送 GET 请求,然后执行请求并处理响应。我们打印了 HTTP 版本和状态码,并将响应实体转换为字符串。
案例 2 :使用 CloseableHttpResponse
获取和处理特定的响应头。
java
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.Header;
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://example.com");
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
// 获取并打印 'Content-Type' 头信息
Header contentTypeHeader = response.getFirstHeader("Content-Type");
if (contentTypeHeader != null) {
System.out.println("Content-Type: " + contentTypeHeader.getValue());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 确保关闭 httpClient 资源
try {
httpClient.close();
} catch (Exception e) {
e.printStackTrace();
}
}
在这个例子中,我们获取了响应的第一个 Content-Type
头信息并打印了它的值。
在使用 CloseableHttpResponse
时,非常重要的一点是确保在处理完响应后调用 close()
方法来释放系统资源。从 Apache HttpClient 4.3.6 开始,可以使用 try-with-resources 语句来自动管理资源,如案例 1 所示。这确保了即使在发生异常的情况下,响应也会被正确关闭。