目录
什么是HttpClient
HttpClient 是 Apache HttpComponents 的一个子项目,旨在提供高效的、最新的、功能丰富的 HTTP 协议客户端编程工具包。它是一个 Java 库,可用于在 Java 应用程序中发送 HTTP 请求并处理 HTTP 响应。
HttpClient 提供了一组 API,使开发人员能够轻松地构建和管理 HTTP 请求,同时它还提供了各种功能,例如连接管理、重定向处理、代理服务器支持、请求/响应拦截器等。
HttpClient 支持 HTTP/1.1 和 HTTP/2 协议,实现了所有 HTTP 的方法(GET,POST,PUT,DELETE 等),支持自动转向,支持代理服务器,支持 HTTPS 协议进行安全传输。
它具有以下主要特点:
- 高效的连接管理:HttpClient 支持连接池、连接重用、连接保持等功能,可以有效地减少网络连接的开销。
- 灵活的请求和响应处理:开发人员可以轻松地构建 HTTP 请求,并且可以方便地对响应进行处理。
- 对 WebSocket 的支持:HttpClient 支持 WebSocket 协议,可以方便地进行 WebSocket 通信。
- 灵活的拦截器:开发人员可以方便地通过拦截器对请求和响应进行预处理和后处理。
- 支持 HTTPS 协议:HttpClient 支持 HTTPS 协议,可以保证数据的安全传输。
总之,HttpClient 是一个功能强大、易于使用、灵活的 HTTP 客户端编程工具包,适用于各种 Java 应用程序。
注意:
HttpClient 3.x 版本与 HttpClient 4.x 版本之间确实存在较大的变化。在 HttpClient 4.x 版本中,API 被设计为更加模块化和扩展性,以便支持更多的 HTTP 方法和协议。此外,HttpClient 4.x 版本还提供了更强大的连接管理、重定向处理、代理服务器支持、请求/响应拦截器等功能。
如果从 HttpClient 3.x 版本升级到 HttpClient 4.x 版本,需要重新编写部分代码,并适应新的 API。建议参考 HttpClient 的官方文档或相关的迁移指南,以了解如何在 HttpClient 4.x 版本中实现相同的功能。
HttpClient的注意事项
HttpClient 是一个 HTTP 客户端库,主要用于发送和接收 HTTP 消息,但它并不具备以下一些特定的功能:
- 处理 HTTP 消息的内容:HttpClient 仅负责传输 HTTP 消息,但不会对消息的内容进行任何处理或解析。它不会执行像 JavaScript 这样的动态代码,也不会关注消息内容的类型或格式。
- 解析 HTML 或其他标记语言:HttpClient 并不具备解析 HTML 或其他标记语言的能力。它只关注 HTTP 消息的传输和基本处理,而不涉及对这些标记语言的解析和操作。
- 处理 content type:HttpClient 本身并不处理或解析 HTTP 消息的内容类型(content type)。它只是将接收到的 HTTP 消息原样传递给调用者,而不关心消息的具体内容类型或格式。
- 执行重定向:默认情况下,HttpClient 不会自动执行 HTTP 重定向。它只会发送原始的 HTTP 请求,并等待服务器返回响应。如果服务器返回了重定向响应,HttpClient 需要由开发人员手动处理重定向。
- 处理其他与 HTTP 消息传输相关的功能:HttpClient 主要关注的是发送和接收 HTTP 消息,对于一些与 HTTP 消息传输相关的功能,如身份验证、缓存、代理等,HttpClient 可能需要配合其他库或配置来实现。
总之,HttpClient 是一个强大的 HTTP 客户端库,主要用于发送和接收 HTTP 消息。然而,它并不具备处理 HTTP 消息内容、解析标记语言、自动执行重定向或其他一些与 HTTP 消息传输相关的特定功能。
HttpClient的使用流程
使用 HttpClient 工具类发送 HTTP 请求的流程通常如下:
- 创建 HttpClient 对象。
- 创建请求方法的实例,并指定请求 URL。如果需要发送 GET 请求,创建 HttpGet 对象;如果需要发送 POST 请求,创建 HttpPost 对象。
- 如果需要发送请求参数,可调用 HttpGet、HttpPost 共同的 setParams(HttpParams params) 方法来添加请求参数;对于 HttpPost 对象而言,也可调用 setEntity(HttpEntity entity) 方法来设置请求参数。
- 调用 HttpClient 对象的 execute(HttpUriRequest request) 发送请求,该方法返回一个 HttpResponse。
- 调用 HttpResponse 的 getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用 HttpResponse 的 getEntity() 方法可获取 HttpEntity 对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
- 释放连接。注意:无论执行方法是否成功,都必须释放连接。
HttpClient常用方法
HttpClient 4.x 是一个用于发送 HTTP 请求的 Java 库,它提供了一组方法来执行各种 HTTP 操作。以下是一些 HttpClient 4.x 的常用方法:
- execute(HttpUriRequest request): 发送请求并返回一个 HttpResponse 对象。
- execute(HttpUriRequest request, HttpContext context): 与上一个方法类似,但增加了额外的上下文信息。
- execute(HttpHost target, HttpRequest request): 在给定的目标主机上发送请求并返回 HttpResponse。
- execute(HttpHost target, HttpRequest request, HttpContext context): 与上一个方法类似,但增加了额外的上下文信息。
- send(HttpEntityEnclosingRequest request, HttpResponse responseHandler): 发送请求并使用指定的响应处理器处理响应。
- send(HttpEntityEnclosingRequest request, Class responseType): 发送请求并返回指定类型的响应对象。
- send(HttpEntityEnclosingRequest request, Type responseType): 与上一个方法类似,但指定了响应类型。
- getParams(): 获取 HttpClient 的参数。
- setParams(HttpParams params): 设置 HttpClient 的参数。
- getRequest(): 获取 HttpClient 的请求方法实例。
- setRequest(HttpRequest request): 设置 HttpClient 的请求方法实例。
- addHeader(String name, String value): 向请求头添加一个字段。
- removeHeader(String name): 从请求头中删除指定的字段。
- getParams(): 获取 HttpClient 的参数。
- setParams(HttpParams params): 设置 HttpClient 的参数。
- getRequest(): 获取 HttpClient 的请求方法实例。
- setRequest(HttpRequest request): 设置 HttpClient 的请求方法实例。
- addHeader(String name, String value): 向请求头添加一个字段。
- removeHeader(String name): 从请求头中删除指定的字段。
- getAllHeaders(): 获取所有请求头的字段。
- getHeaders(String name): 获取指定名称的请求头的字段。
- setEntity(HttpEntity entity): 设置请求参数实体。
- getEntity(): 获取响应内容的 HttpEntity 对象。
- releaseConnection(): 释放连接资源。
HttpClient工具类
添加依赖
XML
<properties>
<httpclient.version>4.5.5</httpclient.version>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<!-- springboot的web和test启动库 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- apache httpclient组件 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 跳过单元测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
下面是一个使用 HttpClient 发送 GET 请求的示例代码:
java
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
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.util.EntityUtils;
public class HttpClientExample {
public static void main(String[] args) throws Exception {
// 创建 HttpClient 对象
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建 HttpGet 对象,并指定请求 URL
HttpGet httpGet = new HttpGet("http://www.example.com");
// 发送 GET 请求,并获取 HttpResponse
HttpResponse httpResponse = httpClient.execute(httpGet);
// 获取响应状态码和响应实体
int statusCode = httpResponse.getStatusLine().getStatusCode();
HttpEntity httpEntity = httpResponse.getEntity();
// 处理响应内容
if (httpEntity != null) {
String responseString = EntityUtils.toString(httpEntity);
System.out.println("Response Code: " + statusCode);
System.out.println("Response Content: " + responseString);
}
// 释放连接资源
httpClient.close();
}
}
注意:
httpClient.close() 是用于关闭 HttpClient 连接的函数。HttpClient 是用于发送 HTTP 请求的 Java 库,当不再需要使用 HttpClient 时,应该调用 close() 函数来释放资源,以避免资源泄漏。
具体来说,httpClient.close() 函数会关闭与服务器之间的连接,并释放相关的资源,如网络连接、线程池等。这有助于提高应用程序的性能和资源利用率,同时避免不必要的资源占用。
在使用 HttpClient 发送完 HTTP 请求后,建议及时调用 close() 函数关闭连接,以保持良好的应用程序性能和资源管理。