一.介绍
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。(jdk17自带HttpClient)
HTTP和浏览器有点像,但却不是浏览器。很多人觉得既然HttpClient是一个HTTP客户端编程工具,很多人把他当做浏览器来理解,但是其实HttpClient不是浏览器,它是一个HTTP通信库,因此它只提供一个通用浏览器应用程序所期望的功能子集,最根本的区别是HttpClient中没有用户界面,浏览器需要一个渲染引擎来显示页面,并解释用户输入,例如鼠标点击显示页面上的某处,有一个布局引擎,计算如何显示HTML页面,包括级联样式表和图像。javascript解释器运行嵌入HTML页面或从HTML页面引用的javascript代码。来自用户界面的事件被传递到javascript解释器进行处理。除此之外,还有用于插件的接口,可以处理Applet,嵌入式媒体对象(如pdf文件,Quicktime电影和Flash动画)或ActiveX控件(可以执行任何操作)。HttpClient只能以编程的方式通过其API用于传输和接受HTTP消息。
HttpClient的主要功能:
- 实现了所有 HTTP 的方法(GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS 等)
- 支持 HTTPS 协议
二.使用
1.准备工作
1.引入依赖
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
2.HttpEntity
HttpEntity表示http的request和resposne实体,它由消息头和消息体组成。
从HttpEntity中可以获取http请求头和回应头,也可以获取http请求体和回应体信息。
2.代码的实现
1.简单的get
@Test
public void aaa() throws IOException {
String url="http://4739pt6462.qicp.vip/aaaaaaa/ccc";
//两种路径传参的方式
//String url="http://4739pt6462.qicp.vip/aaaaaaa/ccc/111111";
//String url="http://4739pt6462.qicp.vip/aaaaaaa/ccc?name=1&age=2";
String result = "";
// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建Get请求
HttpGet request = new HttpGet(url);
CloseableHttpResponse response=null;
try {
// 由客户端执行(发送)Get请求 并获取响应模型
response = httpClient.execute(request);
// 从响应模型中获取响应实体
HttpEntity entity = response.getEntity();
System.out.println("响应状态为:" + response.getStatusLine());
System.out.println("响应内容为:" + EntityUtils.toString(entity));
System.out.println("响应内容长度为:" + entity.getContentLength());
}finally {
//关闭流
httpClient.close();
response.close();
}
}
2.简单的psot
@Test
public void sss() throws IOException {
String url="http://4739pt6462.qicp.vip/aaaaaaa/ddd";
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
HashMap<String, Object> map = new HashMap<>();
map.put("name","张");
map.put("age","李四");
//将对象变成json格式
String s = JSON.toJSONString(map);
//创建请求体 json条件 设置格式
StringEntity entity = new StringEntity(s, "UTF-8");
// post请求是将参数放在请求体里面传过去的;这里将entity放入post请求体中
httpPost.setEntity(entity);
//设置请求头 response.setHeader()这是响应头
httpPost.setHeader("Content-Type", "application/json");
CloseableHttpResponse response = null;
try {
// 由客户端执行(发送)Post请求
response = httpClient.execute(httpPost);
// 从响应模型中获取响应实体
HttpEntity responseEntity = response.getEntity();
System.out.println("响应状态为:" + response.getStatusLine());
System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
System.out.println("响应内容长度为:" + responseEntity.getContentLength());
}finally {
httpClient.close();
response.close();
}
}