一:介绍
二:作用
-
发送 HTTP 请求:HttpClient 可以发送 GET、POST、PUT、DELETE 等各种类型的 HTTP 请求。可以设置请求头、请求参数、请求体等,并支持自定义请求的各种属性。
-
处理响应:HttpClient 可以接收服务器返回的 HTTP 响应,并提供了获取响应状态码、响应头、响应体等信息的方法。你可以根据需要解析响应体,比如将响应转换成字符串、JSON 对象或者字节流。
-
管理连接:HttpClient 可以管理 HTTP 连接池,从而复用连接,避免频繁地创建和关闭连接,提高性能。它还支持超时设置、代理配置、重试机制等功能,以便更好地管理和控制与服务器的连接。
-
支持异步请求:HttpClient 提供了异步请求的能力,可以使用 Future 或回调机制来发送异步请求,从而提高并发性能和响应速度。
-
支持认证和安全性:HttpClient 支持基本认证、摘要认证、OAuth 认证等常见的身份验证机制。它还支持 SSL/TLS 加密,可以进行安全的 HTTPS 请求。
三:核心API以及使用HttpClient的步骤
3.1核心API的作用:
- HttpClient 提供了发送 HTTP 请求和处理响应的核心功能。
- HttpClients 是一个工具类,用于创建 HttpClient 实例。
- CloseableHttpClient 是 HttpClient 的一个实现类,提供了关闭连接和释放资源的能力。
- HttpGet 是用于发送 GET 请求的类,可以设置请求的 URL、请求头、请求参数等。
- HttpPost 是用于发送 POST 请求的类,可以设置请求的 URL、请求头、请求参数、请求体等。
四:入门案例:
4.1使用HttpClient发送GET请求
注:提前开启了/user/shop/status路径可以访问的服务,以保证请求发出可以得到响应
/**
* 测试通过httpclient发送get方式请求
*/
@Test
public void testGET() throws Exception {
//创建httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建请求对象
HttpGet httpGet = new HttpGet("http://localhost:8080/user/shop/status");
//发送请求,接收响应结果
CloseableHttpResponse response = httpClient.execute(httpGet);
//获取服务端返回的状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("服务端返回的状态码是:" + statusCode);
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity);
System.out.println("服务端返回的数据为:" + body);
//关闭资源
response.close();
httpClient.close();
}
4.2使用HttpClient发送POST请求
注:提前开启了/admin/employee/login路径可以访问的服务,以保证请求发出可以得到响应
/**
* 测试通过httpclient发送post方式请求
*/
@Test
public void testPOST() throws Exception {
//创建httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建请求对象
HttpPost httpPost = new HttpPost("http://localhost:8080/admin/employee/login");
JSONObject jsonObject = new JSONObject();
jsonObject.put("username","admin");
jsonObject.put("password","123456");
StringEntity entity = new StringEntity(jsonObject.toString());
//指定请求编码方式
entity.setContentEncoding("utf-8");
//数据格式
entity.setContentType("application/json");
httpPost.setEntity(entity);
//发送请求,接收响应结果
CloseableHttpResponse response = httpClient.execute(httpPost);
//解析返回结果
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("响应码为:" + statusCode);
HttpEntity entity1 = response.getEntity();
String body = EntityUtils.toString(entity1);
System.out.println("响应数据为:" + body);
//关闭资源
response.close();
httpClient.close();
}
五:HttpClient与RestTemplate的对比:
HttpClient 和 RestTemplate 都是 Java 中用于发送 HTTP 请求的工具类,它们的功能类似,但有一些区别和不同的使用场景。
HttpClient 是 Apache HttpComponents 客户端库的核心类,是一个成熟的、稳定的 HTTP 客户端工具,提供了丰富的 API,支持多种协议,如 HTTP/1.1、HTTP/2、HTTPS、FTP 等。在实际项目中,HttpClient 性能较好,可满足大部分的 HTTP 通信需求。
RestTemplate 是 Spring Framework 中的一个工具类,是基于 HttpClient 封装的一套 RESTful 风格的 HTTP 客户端,用于简化发送 HTTP 请求的操作。它提供了多种便捷的方法,例如 GET、POST、PUT、DELETE 等,可以通过 URL 或 URI 发送请求,并将响应的结果转换为指定的 Java 对象。由于其集成于 Spring Framework 中,支持自动注入和其他 Spring 特性,因此在 Spring 项目中使用更加方便。
相对于 HttpClient,RestTemplate 具有以下优点:
- RestTemplate 已经封装了 HttpClient 的大部分功能,使用起来更加简单方便。
- RestTemplate 集成于 Spring Framework 中,可以与 Spring 的其他组件无缝衔接,更加适合在 Spring 项目中使用。
但也有一些需要注意的缺点:
- RestTemplate 依赖于 Spring 框架,如果项目不使用 Spring,就不能使用 RestTemplate。
- RestTemplate 的封装也带来了一定的性能损失。
综上所述,如果你在一个 Spring 项目中使用 HTTP 客户端,则建议使用 RestTemplate;如果你需要在非 Spring 项目中使用 HTTP 客户端,或者需要更高的性能,则可以考虑使用 HttpClient。