HttpClient介绍
HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
HttpClient作用:
- 发送HTTP请求
- 接收响应数据
为什么要在Java程序中发送Http请求?有哪些应用场景呢?
HttpClient应用场景:
当我们在使用扫描支付、查看地图、获取验证码、查看天气等功能时
HttpClient的核心API:
- HttpClient:Http客户端对象类型,使用该类型对象可发起Http请求。
- HttpClients:可认为是构建器,可创建HttpClient对象。
- CloseableHttpClient:实现类,实现了HttpClient接口。
- HttpGet:Get方式请求类型。
- HttpPost:Post方式请求类型。
HttpClient发送请求步骤:
- 创建HttpClient对象
- 创建Http请求对象
- 调用HttpClient的execute方法发送请求
初见时的疑惑:不是已经有Controller了吗?为什么还要有HttpClient
解答:HttpClient与Controller是完全不同的概念,HttpClient是作为一个客服端主动发送请求的,而Controller是作为服务端被动接收请求并相应数据的
HttpClient 是 向外发起请求的工具(客户端行为),用于跨服务或第三方 API 调用。
Controller 是 接收并处理请求的入口(服务端行为),负责协调业务逻辑并返回响应。
二者在架构中分工明确,共同完成完整的 HTTP 交互闭环。
HttpClient入门程序
实现步骤:
- 创建HttpClient对象
- 创建请求对象
- 发送请求,接收响应结果
- 解析响应结果
- 关闭资源
HttpGet
public void testHttpClient() throws Exception {
//创建HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建请求对象
HttpGet httpGet =new HttpGet("http://localhost:8080/user/shop/status");
//调用HttpClient的execute方法发送请求
CloseableHttpResponse response = httpClient.execute(httpGet);
//获取服务端返回的状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println(statusCode);
//响应体
HttpEntity entity = response.getEntity();
//用EntityUtils来解析响应体
String body = EntityUtils.toString(entity);
System.out.println("服务端返回的数据为:"+body);
//关闭资源
response.close();
httpClient.close();
}
返回的结果就和响应给前端的响应数据一样
HttpPost
public void testHttpClientPost() 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();
//用EntityUtils来解析响应体
String body = EntityUtils.toString(entity1);
System.out.println("服务端响应的数据为:"+body);
//关闭资源
response.close();
httpClient.close();
}
也就比HttpGet方法多了一个封装请求参数的步骤