Apache HttpClient使用

一、Apache HttpClient 基础版

HttpClients 是 Apache HttpClient 库中的一个工具类,用于创建和管理 HTTP 客户端实例。Apache HttpClient 是一个强大的 Java HTTP 客户端库,用于发送 HTTP 请求并处理 HTTP 响应。HttpClients 提供了多种方法来创建和配置 HTTP 客户端实例。

以下是关于 HttpClients 的详细讲解:

1. Apache HttpClient 简介

Apache HttpClient 是一个开源的 Java HTTP 客户端库,支持 HTTP/1.1 和 HTTP/2 协议。它提供了丰富的功能,例如:

  • 发送 GET、POST、PUT、DELETE 等 HTTP 请求。

  • 处理 HTTP 请求和响应的头部、状态码、实体等。

  • 支持连接池、重试机制、代理、SSL/TLS 等高级功能。

2. HttpClients 类的作用

HttpClients 是一个工厂类,用于创建 CloseableHttpClient 实例。CloseableHttpClient 是 HTTP 客户端的主要接口,用于执行 HTTP 请求。

HttpClients 提供了多种静态方法来创建和配置 HTTP 客户端实例,例如:

  • 创建默认的 HTTP 客户端。

  • 创建自定义配置的 HTTP 客户端。

  • 创建支持连接池的 HTTP 客户端。


3. HttpClients 的常用方法

(1) HttpClients.createDefault()
  • 功能: 创建一个默认的 HTTP 客户端实例。

  • 特点

    • 使用默认的配置(例如连接池、重试机制等)。

    • 适合大多数简单的 HTTP 请求场景。

  • 示例

    CloseableHttpClient httpClient = HttpClients.createDefault();
(2) HttpClients.createSystem()
  • 功能: 创建一个基于系统属性的 HTTP 客户端实例。

  • 特点

    • 使用系统属性(例如代理设置、超时时间等)来配置客户端。

    • 适合需要与系统配置集成的场景。

  • 示例

    CloseableHttpClient httpClient = HttpClients.createSystem();
(3) HttpClients.custom()
  • 功能: 返回一个 HttpClientBuilder 对象,用于自定义配置 HTTP 客户端。

  • 特点

    • 可以设置连接池、超时时间、代理、SSL/TLS 等高级配置。

    • 适合需要精细控制的场景。

  • 示例

     CloseableHttpClient httpClient = HttpClients.custom().setMaxConnTotal(100) // 最大连接数.setMaxConnPerRoute(10) // 每个路由的最大连接数.build();

4. HttpClients 的使用示例

以下是一个完整的示例,展示如何使用 HttpClients 发送 HTTP GET 请求并处理响应:

 import org.apache.http.client.methods.CloseableHttpResponse;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) {// 1. 创建 HTTP 客户端try (CloseableHttpClient httpClient = HttpClients.createDefault()) {// 2. 创建 HTTP GET 请求HttpGet request = new HttpGet("https://jsonplaceholder.typicode.com/posts/1");​// 3. 发送请求并获取响应try (CloseableHttpResponse response = httpClient.execute(request)) {// 4. 检查响应状态码int statusCode = response.getStatusLine().getStatusCode();System.out.println("Status Code: " + statusCode);​// 5. 获取响应内容String responseBody = EntityUtils.toString(response.getEntity());System.out.println("Response Body: " + responseBody);}} catch (Exception e) {e.printStackTrace();}}}

5. HttpClients 的高级配置

通过 HttpClients.custom() 方法,可以自定义 HTTP 客户端的配置。以下是一些常见的配置选项:

(1) 连接池配置
 CloseableHttpClient httpClient = HttpClients.custom().setMaxConnTotal(100) // 最大连接数.setMaxConnPerRoute(10) // 每个路由的最大连接数.build();
(2) 超时配置
 RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000) // 连接超时时间.setSocketTimeout(5000) // 读取超时时间.build();​CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();
(3) 代理配置
 HttpHost proxy = new HttpHost("proxy.example.com", 8080);​CloseableHttpClient httpClient = HttpClients.custom().setProxy(proxy).build();
(4) SSL/TLS 配置
 SSLContext sslContext = SSLContexts.custom().loadTrustMaterial((chain, authType) -> true) // 信任所有证书.build();​CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build();

6. 注意事项

  1. 资源释放CloseableHttpClientCloseableHttpResponse 都实现了 Closeable 接口,使用后需要关闭以释放资源。

  2. 线程安全CloseableHttpClient 是线程安全的,可以在多线程环境中共享。

  3. 性能优化: 使用连接池和合理的超时配置可以显著提升性能。


7. 总结

  • HttpClients 是 Apache HttpClient 库中的一个工具类,用于创建和管理 HTTP 客户端实例。

  • 它提供了多种方法来创建默认或自定义配置的 HTTP 客户端。

  • 通过 HttpClients.custom() 方法,可以实现连接池、超时、代理、SSL/TLS 等高级配置。

  • 使用 Apache HttpClient 可以轻松发送 HTTP 请求并处理响应,是 Java 中处理 HTTP 请求的强大工具。

二、Apache HttpClient 高级版

1. HttpClients 类概述

HttpClients 是 Apache HttpClient 库中的一个工厂类,用于创建和配置 CloseableHttpClient 实例。它是构建 HTTP 客户端的入口点,支持高度自定义的 HTTP 请求处理,包括连接池管理、SSL/TLS 配置、重试机制等。


2. 核心方法与配置

2.1 创建默认客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
  • 特点

    • 使用默认的配置(连接池、请求重试等)。

    • 适合简单场景,但扩展性有限。

2.2 自定义配置客户端

通过 HttpClients.custom() 返回 HttpClientBuilder,允许精细化配置:

 CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager)  // 连接池管理.setDefaultRequestConfig(requestConfig)   // 请求超时配置.setRetryHandler(retryHandler)            // 请求重试策略.setProxy(proxy)                          // 代理设置.setSSLContext(sslContext)                // SSL/TLS 配置.build();

3. 高级配置详解

3.1 连接池管理

连接池是提升性能的关键组件,避免频繁创建和销毁连接。

 PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(200);          // 最大总连接数connectionManager.setDefaultMaxPerRoute(20); // 每个路由(目标主机)的最大连接数​CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build();
3.2 超时配置
 RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000)    // 连接建立超时时间(毫秒).setSocketTimeout(10000)     // 数据传输超时时间(毫秒).setConnectionRequestTimeout(2000) // 从连接池获取连接的超时时间.build();​CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();
3.3 重试机制

自动重试失败的请求(例如网络波动导致失败):

 HttpRequestRetryHandler retryHandler = (exception, executionCount, context) -> {if (executionCount >= 3) return false; // 最大重试次数if (exception instanceof NoHttpResponseException) return true; // 无响应时重试return false;};​CloseableHttpClient httpClient = HttpClients.custom().setRetryHandler(retryHandler).build();
3.4 代理配置
 HttpHost proxy = new HttpHost("proxy.example.com", 8080);CloseableHttpClient httpClient = HttpClients.custom().setProxy(proxy).build();
3.5 SSL/TLS 配置

信任所有证书(仅限测试环境):

 SSLContext sslContext = SSLContexts.custom().loadTrustMaterial((chain, authType) -> true) // 信任所有证书.build();​CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) // 跳过主机名验证.build();
3.6 认证机制

使用 Basic 认证:

 CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(new AuthScope("host.example.com", 80),new UsernamePasswordCredentials("user", "pass"));​CloseableHttpClient httpClient = HttpClients.custom().setDefaultCredentialsProvider(credentialsProvider).build();

4. 请求与响应处理

4.1 发送 GET 请求
 HttpGet httpGet = new HttpGet("https://api.example.com/data");try (CloseableHttpResponse response = httpClient.execute(httpGet)) {int statusCode = response.getStatusLine().getStatusCode();HttpEntity entity = response.getEntity();String content = EntityUtils.toString(entity);EntityUtils.consume(entity); // 确保资源释放}
4.2 发送 POST 请求(JSON 数据)
 HttpPost httpPost = new HttpPost("https://api.example.com/create");StringEntity jsonEntity = new StringEntity("{\"key\":\"value\"}", ContentType.APPLICATION_JSON);httpPost.setEntity(jsonEntity);​try (CloseableHttpResponse response = httpClient.execute(httpPost)) {// 处理响应...}
4.3 文件上传(Multipart)
 HttpPost httpPost = new HttpPost("https://api.example.com/upload");FileBody fileBody = new FileBody(new File("path/to/file"));MultipartEntityBuilder builder = MultipartEntityBuilder.create().addPart("file", fileBody).addTextBody("comment", "File upload");httpPost.setEntity(builder.build());

5. 高级功能

5.1 异步请求

使用 HttpAsyncClients 实现异步非阻塞请求:

 CloseableHttpAsyncClient asyncClient = HttpAsyncClients.custom().build();asyncClient.start();​SimpleHttpRequest request = SimpleHttpRequest.get("https://api.example.com/data");Future<SimpleHttpResponse> future = asyncClient.execute(request, new FutureCallback<>() {@Overridepublic void completed(SimpleHttpResponse response) {System.out.println("Response: " + response.getBodyText());}​@Overridepublic void failed(Exception ex) {ex.printStackTrace();}​@Overridepublic void cancelled() {System.out.println("Request cancelled");}});
5.2 请求拦截器

添加自定义逻辑(如日志记录、修改请求头):

 CloseableHttpClient httpClient = HttpClients.custom().addInterceptorFirst((HttpRequestInterceptor) (request, context) -> {request.addHeader("X-Custom-Header", "value");System.out.println("Request URI: " + request.getRequestLine().getUri());}).build();
5.3 Cookie 管理

自动管理 Cookie:

 CookieStore cookieStore = new BasicCookieStore();CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();

6. 最佳实践与常见问题

6.1 资源释放

确保关闭 CloseableHttpClientCloseableHttpResponse

 try (CloseableHttpClient httpClient = HttpClients.createDefault()) {try (CloseableHttpResponse response = httpClient.execute(request)) {// 处理响应...}}
6.2 性能调优
  • 连接池参数:根据并发需求调整 MaxTotalDefaultMaxPerRoute

  • 超时设置:避免因网络问题导致线程阻塞。

  • 重用连接:复用 HttpClient 实例而非频繁创建。

6.3 错误处理
  • 重试策略:针对可恢复错误(如超时)配置自动重试。

  • 异常捕获:处理 IOExceptionClientProtocolException 等。

6.4 安全性
  • 生产环境禁用信任所有证书:使用有效 CA 签名的证书。

  • 敏感信息保护:避免在日志中打印请求头或响应体中的敏感数据。


7. 典型应用场景

  1. 微服务间通信:在分布式系统中通过 HTTP 调用其他服务。

  2. API 集成:调用第三方 RESTful API(如支付网关、地图服务)。

  3. 爬虫开发:抓取网页内容并解析数据。

  4. 文件传输:上传/下载文件到远程服务器。

  5. 测试自动化:模拟客户端发送 HTTP 请求验证接口功能。


8. 官方文档与资源

  • Apache HttpClient 官方文档: Apache HttpComponents – HttpClient Overview

  • GitHub 仓库: https://github.com/apache/httpcomponents-client


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven版本统一管理

多模块的项目&#xff0c;怎么方便管理 模块的版本号呢&#xff1f; 可以使用 ${revision} 配合 flatten-maven-plugin插件 <plugin><groupId>org.codehaus.mojo</groupId><artifactId>flatten-maven-plugin</artifactId><version>1.1.0&…

时序数据库 InfluxDB(一)

时序数据库 InfluxDB&#xff08;一&#xff09; 数据库种类有很多&#xff0c;比如传统的关系型数据库 RDBMS&#xff08; 如 MySQL &#xff09;&#xff0c;NoSQL 数据库&#xff08; 如 MongoDB &#xff09;&#xff0c;Key-Value 类型&#xff08; 如 redis &#xff09…

E5071C数据保存教程:SNP文件/CSV导出+远程传输步骤一键收藏

Keysight E5071C 网络分析仪支持多种数据存储方式&#xff0c;以下是详细的操作步骤和注意事项&#xff1a; 1. 内部存储&#xff08;仪器内存&#xff09; 保存测量数据&#xff1a; 轨迹数据&#xff1a;按 Save/Recall → Save Trace Data → 选择存储格式&#xff08;如 …

业务相关

目录 一、Spark 1.spark主要用来计算什么&#xff1f; 随便说段代码 2.spark 运行命令说一个&#xff0c;平常用哪些参数&#xff0c;怎么考虑的 3.spark shuffle的代码有哪些&#xff0c;平日哪些操作涉及到shuffle了 4.计算中遇到最难解决的是什么&#xff1f; 5.Spark …

LLM之RAG实战(五十二)| 如何使用混合搜索优化RAG 检索

在RAG项目中&#xff0c;大模型生成的参考内容&#xff08;专业术语称为块&#xff09;来自前一步的检索&#xff0c;检索的内容在很大程度上直接决定了生成的效果&#xff0c;因此检索对于RAG项目至关重要&#xff0c;最常用的检索方法是关键字搜索和语义搜索。本文将分别介绍…

[学成在线]07-视频转码

视频转码 视频上传成功后需要对视频进行转码处理。 首先我们要分清文件格式和编码格式&#xff1a; 文件格式&#xff1a;是指.mp4、.avi、.rmvb等这些不同扩展名的视频文件的文件格式 &#xff0c;视频文件的内容主要包括视频和音频&#xff0c;其文件格式是按照一定的编码…

Leetcode算法方法总结

1. 双指针法解决链表/数组题目 只要数组有序&#xff0c;就要想到双指针做法。还有二分法 回文串一般也会用到双指针&#xff0c;回文串的长度由于可能是奇数也可能是偶数&#xff0c;所以在寻找时&#xff0c;既需要寻找奇数长度的回文串&#xff0c;也需要寻找偶数长度的回文…

一周掌握Flutter开发--9. 与原生交互(上)

文章目录 9. 与原生交互核心场景9.1 调用平台功能&#xff1a;MethodChannel9.1.1 Flutter 端实现9.1.2 Android 端实现9.1.3 iOS 端实现9.1.4 使用场景 9.2 使用社区插件9.2.1 常用插件9.2.2 插件的优势 总结 9. 与原生交互 Flutter 提供了强大的跨平台开发能力&#xff0c;但…

基于Flask的通用登录注册模块,并代理跳转到目标网址

实现了用户密码的加密&#xff0c;代理跳转到目标网址&#xff0c;不会暴露目标路径&#xff0c;未登录的情况下访问proxy则自动跳转到登录页&#xff0c;使用时需要修改配置项config&#xff0c;登录注册页面背景快速修改&#xff0c;可以实现登录注册模块的快速复用。 1.app…

Java课程设计(双人对战游戏)持续更新......

少废话&#xff0c;当然借助了ai&#xff0c;就这么个实力&#xff0c;后续会逐渐完善...... 考虑添加以下功能&#xff1a; 选将&#xff0c;选图&#xff0c;技能&#xff0c;天赋&#xff0c;道具&#xff0c;防反&#xff0c;反重力&#xff0c;物理反弹&#xff0c;击落…

Ai工作流工具有那些如Dify、coze扣子等以及他们是否开源

Dify &#xff08;https://difycloud.com/&#xff09; 核心定位&#xff1a;专业级 LLM 应用开发平台&#xff0c;支持复杂 AI 工作流构建与企业级管理。典型场景&#xff1a;企业智能客服、数据分析系统、复杂自动化流程构建等。适合需要深度定制、企业级管理和复杂 AI 逻辑…

Debezium系列之:使用Debezium和Apache Iceberg构建数据湖

Debezium系列之:使用Debezium和Apache Iceberg构建数据湖 Debezium Server Iceberg“Debezium Server Iceberg” 消费者设置数据复制Upsert 模式保留已删除的记录使用Upsert模式追加模式优化批处理大小在数据分析的世界中,数据湖是存储和管理大量数据以满足数据分析、报告或机…

docker run -p 5000:5000 my-flask-app

docker run -p 5000:5000 my-flask-app代码的意思是&#xff1a; 运行 my-flask-app 容器&#xff0c;并把 Flask 服务器的 5000 端口映射到本机的 5000 端口。 拆解解释 docker run -p 5000:5000 my-flask-app✅ docker run → 运行一个 Docker 容器 ✅ -p 5000:5000 → 端口…

高光谱工业相机+LED光源系统助力材料分类和异物检测、实现高速在线检测

检测光源包括可见光&#xff0c;如红光、蓝光和绿光以及其他波长的光&#xff0c;如紫外和红外波长&#xff0c;可以选择与检测对象物相应的波长。但由于能够照射的波长较窄&#xff0c;例如受到同色异物混入或多个素材的材质分类等&#xff0c;可能需要使用可照射多种波长的光…

Spring 拦截器(Interceptor)与过滤器(Filter)对比

Spring 拦截器&#xff08;Interceptor&#xff09;与过滤器&#xff08;Filter&#xff09;对比 核心对比表格 对比维度拦截器&#xff08;Interceptor&#xff09;过滤器&#xff08;Filter&#xff09;定义Spring MVC 提供的组件&#xff0c;集成于 Spring 处理器链。Servl…

VulnHub-FALL通关攻略

第一步&#xff1a;确定靶机IP为192.168.40.129 第二步&#xff1a;扫描后台及开放端口 #开放端口 22 --- ssh 25 --- SMTP简单邮件传输协议 80 --- HTTP万维网传输信息协议 110 --- POP3邮件协议3 139 --- NetBIOS服务 443 --- https服务 445 --- SMB协议 3306 --- Mysql 808…

Qt 线程和 QObjects

线程和 QObjects QThread 继承于 QObject。 它发出信号来指示线程开始或结束执行&#xff0c;并提供一些插槽。 更有趣的是&#xff0c;QObjects 可以在多个线程中使用&#xff0c;发出信号以调用其他线程中的插槽&#xff0c;并向 "生活 "在其他线程中的对象发布事件…

华为、浪潮、华三链路聚合概述

1、华为 链路聚合可以提高链路带宽和链路冗余性。有三种类型&#xff0c;分别是手工链路聚合&#xff0c;静态lacp链路聚合&#xff0c;动态lacp链路聚合。 手工链路模式&#xff1a;也称负载分担模式&#xff0c;需手动指定链路&#xff0c;各链路之间平均分担流量。静态LAC…

HarmonyOS NEXT 鸿蒙中关系型数据库@ohos.data.relationalStore API 9+

核心API ohos.data.relationalStore API 9 数据库 数据库是存储和管理数据的系统 数据库&#xff08;Database&#xff09;是一个以特定方式组织、存储和管理数据的集合&#xff0c;通常用于支持各种应用程序和系统的运行。它不仅是存放数据的仓库&#xff0c;还通过一定的…

步进电机 cia402协议 报文自己的理解 (笔记)

1. cai402 协议是什么 CiA 402 协议&#xff08;CAN in Automation 402&#xff09;&#xff0c;它是工业自动化领域中的一种通信协议&#xff0c;主要用于运动控制&#xff08;如伺服驱动器、步进电机等&#xff09;&#xff08; &#xff09;所属标准 CiA 402 是 CANopen 应用…