一、HttpClient的基本介绍
-
Apache Jakarta Commons 下的 HttpClient 是一个开源的 Java HTTP 客户端库,用于发送 HTTP 请求和处理 HTTP 响应。它提供了一组简单易用的 API,使得与 Web 服务器进行通信变得简单而灵活。下面是 HttpClient 的基本介绍:
-
- 功能丰富:HttpClient 提供了丰富的功能和灵活的配置选项,可以满足各种不同的 HTTP 客户端需求。它支持 HTTP/1.1 和 HTTP/2 协议,支持 GET、POST、PUT、DELETE 等 HTTP 方法,支持重定向、代理服务器、身份认证等特性。
-
- 易用性:HttpClient 提供了简单易用的 API,使得发送 HTTP 请求和处理 HTTP 响应变得非常简单。开发人员可以轻松地创建 HttpClient 实例、构建 HTTP 请求、发送请求并处理响应。
-
- 性能优化:HttpClient 具有良好的性能和高效的资源管理机制。它支持连接池管理,可以重用已建立的连接,减少连接的创建和关闭开销,提高性能。此外,HttpClient 还支持异步请求和非阻塞 I/O 操作,可以更好地利用系统资源。
-
- 可定制性:HttpClient 允许开发人员对其行为进行灵活的定制和配置。你可以配置连接超时、读取超时、最大连接数、请求重试策略等参数,以满足特定的业务需求。
-
- 广泛应用:HttpClient 在 Java 开发领域广泛应用,被用于构建网络爬虫、编写 Web 服务客户端、进行自动化测试、与 RESTful API 进行交互等场景。
-
- 稳定性和可靠性:HttpClient 是一个成熟稳定的项目,经过了长期的开发和测试,拥有庞大的用户群体和活跃的社区支持。它的稳定性和可靠性得到了广泛验证,可以放心使用。
-
-
总之,Apache Jakarta Commons HttpClient 是一个功能强大、易用性高、性能优秀的 Java HTTP 客户端库,是 Java 开发中常用的工具之一。
-
HttpClient是Apache的一个子项目,是高效的、功能丰富的支持HTTP协议的客户端编程工具包。
-
HttpClient的作用:
- 发送 HTTP 请求
- 接收 HTTP 响应的数据
二、HttpClient的基本使用
- 引入依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version> <!-- 请根据你的需求选择合适的版本 -->
</dependency>
- 代码中的操作步骤:
-
- 创建 HttpClient 实例: 使用 DefaultHttpClient 或 CloseableHttpClient 类创建 HttpClient 实例。
-
- 构建 HTTP 请求: 使用 HttpGet、HttpPost 等类构建 HTTP 请求。你需要指定请求的 URL、请求头和请求体(如果需要的话)。
-
- 发送 HTTP 请求: 使用 HttpClient 实例执行 HTTP 请求,并接收 HttpResponse 对象。
-
- 处理 HTTP 响应: 可以从 HttpResponse 对象中获取响应的状态码、响应头和响应体等信息。
-
- 关闭 HttpClient: 使用完 HttpClient 后,需要关闭以释放资源。
-
package com.sky.test;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
//把注解注释起来,不然每次运行项目都会运行测试类
@SpringBootTest
public class HttpClientTest {
/**
* 测试通过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();
}
/**
* 测试通过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的应用场景
-
Apache Jakarta Commons 下的 HttpClient 是一个功能强大的 HTTP 客户端库,它可以用于许多不同的应用场景,包括但不限于:
-
- 网络爬虫和数据采集:HttpClient 提供了丰富的 API,可以方便地发送 HTTP 请求并处理响应。这使得它非常适合用于编写网络爬虫和数据采集工具,用于抓取网页内容、API 数据或其他网络资源。
-
- Web 服务客户端:HttpClient 可以用作 Web 服务的客户端,用于与 RESTful API、SOAP 服务或其他基于 HTTP 的服务进行通信。它可以发送 GET、POST、PUT、DELETE 等类型的请求,并处理服务端返回的数据。
-
- 自动化测试:HttpClient 可以在自动化测试中用来模拟客户端行为,发送请求并验证服务端返回的响应。这在进行 API 测试、集成测试或端到端测试时非常有用。
-
- 数据交换:HttpClient 可以用于与各种数据源进行交换数据,例如与远程数据库、文件服务器或其他 HTTP 服务进行数据交换。
-
- 代理服务器:HttpClient 支持代理服务器,可以通过代理服务器发送请求,并可以配置代理服务器的认证信息等。
-
- 身份验证:HttpClient 支持多种身份验证方式,包括基本认证、摘要认证、NTLM 认证等,可以用于与需要身份验证的服务进行通信。
-
- 文件上传和下载:HttpClient 可以用于上传文件到服务器或从服务器下载文件,支持发送 multipart/form-data 类型的请求。
-
- 长连接和连接池管理:HttpClient 支持 HTTP 1.1 的持久连接机制,可以重复使用已建立的连接,并提供连接池管理功能,以提高性能和减少资源消耗。
-
-
总之,Apache Jakarta Commons 下的 HttpClient 是一个功能丰富、灵活易用的 HTTP 客户端库,可以满足各种不同的网络通信需求,是 Java 开发中常用的工具之一。
三、1、 (案例)微信登录功能(通过HttpClient访问微信接口服务)
一般会封装成一个工具类使用:
/**
* Http工具类
*/
public class HttpClientUtil {
static final int TIMEOUT_MSEC = 5 * 1000;
/**
* 发送GET方式请求
* @param url
* @param paramMap
* @return
*/
public static String doGet(String url,Map<String,String> paramMap){
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = "";
CloseableHttpResponse response = null;
try{
URIBuilder builder = new URIBuilder(url);
if(paramMap != null){
for (String key : paramMap.keySet()) {
builder.addParameter(key,paramMap.get(key));
}
}
URI uri = builder.build();
//创建GET请求
HttpGet httpGet = new HttpGet(uri);
//发送请求
response = httpClient.execute(httpGet);
//判断响应状态
if(response.getStatusLine().getStatusCode() == 200){
result = EntityUtils.toString(response.getEntity(),"UTF-8");
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
response.close();
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
/**
* 发送POST方式请求
* @param url
* @param paramMap
* @return
* @throws IOException
*/
public static String doPost(String url, Map<String, String> paramMap) throws IOException {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建参数列表
if (paramMap != null) {
List<NameValuePair> paramList = new ArrayList();
for (Map.Entry<String, String> param : paramMap.entrySet()) {
paramList.add(new BasicNameValuePair(param.getKey(), param.getValue()));
}
// 模拟表单
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
httpPost.setEntity(entity);
}
httpPost.setConfig(builderRequestConfig());
// 执行http请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
} catch (Exception e) {
throw e;
} finally {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
/**
* 发送POST方式请求
* @param url
* @param paramMap
* @return
* @throws IOException
*/
public static String doPost4Json(String url, Map<String, String> paramMap) throws IOException {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
if (paramMap != null) {
//构造json格式数据
JSONObject jsonObject = new JSONObject();
for (Map.Entry<String, String> param : paramMap.entrySet()) {
jsonObject.put(param.getKey(),param.getValue());
}
StringEntity entity = new StringEntity(jsonObject.toString(),"utf-8");
//设置请求编码
entity.setContentEncoding("utf-8");
//设置数据类型
entity.setContentType("application/json");
httpPost.setEntity(entity);
}
httpPost.setConfig(builderRequestConfig());
// 执行http请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
} catch (Exception e) {
throw e;
} finally {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
private static RequestConfig builderRequestConfig() {
return RequestConfig.custom()
.setConnectTimeout(TIMEOUT_MSEC)
.setConnectionRequestTimeout(TIMEOUT_MSEC)
.setSocketTimeout(TIMEOUT_MSEC).build();
}
}
四、HttpClient的实现原理
-
HttpClient 是 Apache 软件基金会提供的一个功能强大的 HTTP 客户端库,用于发送 HTTP 请求和处理 HTTP 响应。它的实现原理涉及到底层的网络通信、连接管理、请求处理等多个方面。
-
HttpClient 的基本实现原理:
-
- 网络通信:HttpClient 使用 Java 标准库提供的网络通信 API(如
java.net.Socket
、java.net.HttpURLConnection
等)进行 HTTP 请求的发送和响应的接收。它可以通过配置代理、设置连接超时、读取超时等参数来控制网络通信的行为。
- 网络通信:HttpClient 使用 Java 标准库提供的网络通信 API(如
-
- 连接管理:HttpClient 使用连接池来管理 HTTP 连接,以提高性能和降低资源消耗。连接池维护了一组可重用的连接对象,当需要发送 HTTP 请求时,可以从连接池中获取连接对象并重用,而不是每次都创建新的连接。连接池还可以根据连接的状态、空闲时间等因素来动态调整连接数量,以满足不同负载下的需求。
-
- 请求处理:HttpClient 提供了丰富的 API 来构建 HTTP 请求,包括设置请求方法、请求头、请求体等。它可以发送 GET、POST、PUT、DELETE 等各种类型的请求,并支持文件上传、表单提交、多部分请求等功能。HttpClient 还支持重定向、认证、Cookie 管理、SSL/TLS 安全等特性。
-
- 响应处理:HttpClient 可以解析 HTTP 响应并提取其中的状态码、响应头、响应体等信息。它支持解析各种类型的响应内容,包括文本、JSON、XML、字节流等。HttpClient 还提供了流式 API 来逐行读取响应内容,以便于处理大型响应或实时流数据。
-
- 线程安全性:HttpClient 是线程安全的,可以在多线程环境中安全地共享和重用。它使用了同步、锁机制等技术来确保在并发访问时的线程安全性。
-
-
总的来说,HttpClient 的实现原理基于底层的网络通信、连接管理、请求处理等机制,提供了一个高性能、高度可配置、易用的 HTTP 客户端库,适用于各种类型的 HTTP 请求和响应场景。