造轮子系列:从0到1打造生产级HTTP客户端,优雅封装OkHttp/HttpClient,支持异步、重试与文件操作

TechZhi HTTP Client Starter

    • 源码
    • 特性
    • 快速开始
      • 1. 添加依赖
      • 2. 配置
      • 3. 使用
    • 主要功能
      • 支持的HTTP方法
      • 文件操作功能
      • 高级功能
      • 配置示例
    • API使用示例
      • 基本请求
      • 自定义请求
      • 异步请求
      • 文件操作示例
      • 错误处理
    • 构建和测试
    • 依赖说明

本文将介绍一款本人开发的高性能Spring Boot HTTP客户端Starter,它完美整合了OkHttp和Apache HttpClient。该项目旨在解决原生HTTP客户端以及RestTemplate在文件上传下载、异步请求、失败重试等场景下的复杂性,提供一个配置简单、功能强大的解决方案。

源码

https://github.com/ShouZhiDuan/easydo/blob/main/http-client-starter/README.md

特性

  • 🚀 高性能: 基于OkHttp和Apache HttpClient 5的高性能HTTP客户端
  • 🔧 易配置: 丰富的配置选项,支持连接池、超时、重试等
  • 🔐 安全支持: 支持SSL/TLS配置,可关闭证书校验
  • 🌐 代理支持: 支持HTTP和SOCKS代理配置
  • 📝 日志集成: 可配置的请求/响应日志记录
  • 🔄 重试机制: 内置智能重试机制
  • 💻 异步支持: 支持同步和异步HTTP请求
  • 🎯 类型安全: 自动JSON序列化/反序列化
  • 🛠️ Spring Boot集成: 无缝集成Spring Boot自动配置
  • 📁 文件操作: 完整的文件上传、下载和流处理支持
  • 📊 进度跟踪: 文件传输进度回调和监控
  • 🔍 智能检测: 自动文件类型检测和Content-Type映射

快速开始

1. 添加依赖

<dependency><groupId>com.techzhi.common</groupId><artifactId>http-client-starter</artifactId><version>1.0.0</version>
</dependency>

2. 配置

techzhi:http-client:enabled: trueclient-type: OK_HTTPconnect-timeout: 10sread-timeout: 30s# 更多配置选项请参考配置文档

3. 使用

@Service
public class MyService {@Autowiredprivate HttpClient httpClient;@Autowiredprivate HttpClientTemplate httpClientTemplate;public void example() {// 基本GET请求HttpResponse<String> response = httpClient.get("https://api.example.com/data");// 带类型转换的GET请求HttpResponse<User> userResponse = httpClient.get("https://api.example.com/user/1", User.class);// POST请求User newUser = new User("John", "john@example.com");HttpResponse<User> createResponse = httpClient.post("https://api.example.com/users", newUser, User.class);// 使用模板类HttpResponse<String> tokenResponse = httpClientTemplate.getWithToken("https://api.example.com/protected", "your-token");}
}

主要功能

支持的HTTP方法

  • GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS
  • 同步和异步请求
  • 自动JSON序列化/反序列化
  • 表单提交支持

文件操作功能

  • 文件上传: 支持单个和多个文件上传
  • 多部分表单: multipart/form-data支持,可混合文件和表单字段
  • 文件下载: 支持大文件流式下载,自动创建目录
  • 进度回调: 上传和下载进度实时监控
  • 文件流: 获取文件输入流和字节数组
  • 类型检测: 自动文件类型检测和Content-Type映射
  • 异步操作: 支持异步文件上传和下载

高级功能

  • 连接池管理
  • 代理配置(HTTP/SOCKS)
  • SSL/TLS配置(支持关闭证书验证)
  • 重试机制
  • 请求/响应日志
  • Bearer Token和Basic认证

配置示例

techzhi:http-client:enabled: trueclient-type: OK_HTTP  # OK_HTTP 或 APACHE_HTTP_CLIENTconnect-timeout: 10sread-timeout: 30swrite-timeout: 30s# 连接池配置pool:max-total: 200default-max-per-route: 50time-to-live: 5m# 代理配置proxy:enabled: falsetype: HTTPhost: proxy.example.comport: 8080# SSL配置ssl:verify-hostname: trueverify-certificate-chain: true# 重试配置retry:enabled: truemax-attempts: 3retry-interval: 1s

API使用示例

基本请求

// GET请求
HttpResponse<String> response = httpClient.get("https://httpbin.org/get");// POST请求
Map<String, Object> data = Map.of("key", "value");
HttpResponse<String> postResponse = httpClient.post("https://httpbin.org/post", data);

自定义请求

HttpRequest request = HttpRequest.post("https://httpbin.org/post").header("Authorization", "Bearer token").header("Content-Type", "application/json").queryParam("page", "1").jsonBody(requestData);HttpResponse<ResponseData> response = httpClient.execute(request, ResponseData.class);

异步请求

CompletableFuture<HttpResponse<String>> future = httpClient.getAsync("https://httpbin.org/get");
future.thenAccept(response -> {System.out.println("Response: " + response.getBody());
});

文件操作示例

// 1. 单个文件上传
File file = new File("document.pdf");
HttpResponse<String> uploadResponse = httpClient.uploadFile("https://api.example.com/upload", "file", file
);// 2. 文件上传带进度回调
FileProgressCallback progressCallback = new FileProgressCallback() {@Overridepublic void onProgress(long bytesTransferred, long totalBytes, double percentage) {System.out.printf("上传进度: %.2f%%\n", percentage);}@Overridepublic void onComplete(long totalBytes) {System.out.println("上传完成: " + totalBytes + " bytes");}
};httpClient.uploadFile("https://api.example.com/upload", "file", file, progressCallback);// 3. 多文件上传
List<MultipartFile> files = Arrays.asList(MultipartFile.of("file1", new File("doc1.pdf")),MultipartFile.of("file2", new File("doc2.pdf")),MultipartFile.of("data", "info.json", jsonData.getBytes(), "application/json")
);HttpResponse<String> multiResponse = httpClient.uploadFiles("https://api.example.com/upload", files);// 4. 文件和表单数据混合上传
Map<String, String> formFields = new HashMap<>();
formFields.put("title", "文档标题");
formFields.put("category", "技术文档");httpClient.uploadFilesWithForm("https://api.example.com/upload", files, formFields);// 5. 文件下载
boolean downloadSuccess = httpClient.downloadFile("https://api.example.com/download/report.pdf", "/path/to/save/report.pdf"
);// 6. 文件下载带进度回调
httpClient.downloadFile("https://api.example.com/download/large-file.zip", "/path/to/save/large-file.zip", progressCallback
);// 7. 获取文件字节数组
byte[] fileBytes = httpClient.getFileBytes("https://api.example.com/download/small-file.txt");// 8. 获取文件流
try (InputStream fileStream = httpClient.getFileStream("https://api.example.com/download/data.csv")) {// 处理文件流BufferedReader reader = new BufferedReader(new InputStreamReader(fileStream));String line;while ((line = reader.readLine()) != null) {// 处理每一行}
}// 9. 异步文件操作
CompletableFuture<HttpResponse<String>> asyncUpload = httpClient.uploadFileAsync("https://api.example.com/upload", "file", file
);CompletableFuture<Boolean> asyncDownload = httpClient.downloadFileAsync("https://api.example.com/download/file.zip", "/path/to/save/file.zip"
);

错误处理

HttpResponse<String> response = httpClient.get("https://httpbin.org/status/404");if (response.isSuccessful()) {String data = response.getBody();
} else if (response.isClientError()) {System.out.println("Client error: " + response.getStatusCode());
} else if (response.isServerError()) {System.out.println("Server error: " + response.getStatusCode());
}

构建和测试

# 编译项目
mvn clean compile# 运行测试
mvn test# 打包
mvn clean package# 安装到本地仓库
mvn install

依赖说明

本项目支持以下HTTP客户端实现:

  • OkHttp: 默认实现,高性能、轻量级
  • Apache HttpClient 5: 功能丰富,企业级特性

根据项目需求选择合适的实现,通过配置techzhi.http-client.client-type来切换。

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

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

相关文章

Java过滤器的基本概念

概述 Java 过滤器是 Java EE (Jakarta EE) 中的一种组件&#xff0c;用于在请求到达 Servlet 或 JSP 之前对其进行预处理&#xff0c;或者在响应返回客户端之前对其进行后处理。过滤器主要应用于以下场景&#xff1a; 请求参数过滤和转换字符编码处理身份验证和授权日志记录压…

gbase8s数据库获取jdbc/odbc协议的几种方式

PROTOCOLTRACEFILED:\sqltrace1.log;PROTOCOLTRACE5 jdbc 参数 &#xff0c;明文协议&#xff0c;并发时 会错乱&#xff0c;适合单线程调试 SQLIDEBUGC:\Users\lenovo\Desktop\sqlidebug.log1 jdbc参数&#xff0c;密文协议&#xff0c;需使用解密工具解析&#xff0c;解析…

【android bluetooth 框架分析 04】【bt-framework 层详解 7】【AdapterProperties介绍】

前面我们提到了 蓝牙协议栈中的 Properties &#xff0c; 这篇文章是 他的补充。 【android bluetooth 框架分析 04】【bt-framework 层详解 6】【Properties介绍】 在 AOSP&#xff08;Android Open Source Project&#xff09;中&#xff0c;AdapterProperties 是一个 Java…

C盘瘦身?

突然发现回收站底部有横幅辣眼睛&#xff01; 点击深度清理跳转C盘瘦身 点击一键瘦身跳转支付 回收站右键还有菜单 回收站右键可以通过设置关闭 回收站底部横幅关不了&#xff01; 流氓没人管了吗&#xff1f;

用户通知服务,轻松实现应用与用户的多场景交互

用户在使用应用时&#xff0c;经常想要了解应用程序在执行的操作&#xff0c;如下载完成、新邮件到达、发布即时的客服支付通知等&#xff0c;这些通知除了携带基本的文本图片信息外&#xff0c;最好还可以支持文件上传下载进度场景下的进度条通知&#xff0c;以及点击通知栏可…

苹果获智能钱包专利,Find My生态版图或再扩张:钱包会“说话”还能防丢

苹果公司近日成功获批一项突破性专利&#xff0c;揭示了一种支持Find My网络的全新智能钱包设计方案。该钱包不仅能智能管理用户的信用卡、身份证等实体卡片&#xff0c;更具备了追踪定位和通过扬声器发声提醒的能力&#xff0c;有望成为苹果“查找”&#xff08;Find My&#…

当机床开始“思考”,传统“制造”到“智造”升级路上的法律暗礁

——首席数据官高鹏律师团队创作&#xff0c;AI辅助 一、被时代推着走的工厂&#xff1a;从“铁疙瘩”到“智能体”的阵痛 某汽车零部件厂的李厂长至今记得三年前的凌晨。为了赶上新能源车企的订单&#xff0c;厂里咬牙引进了两条智能生产线&#xff0c;可调试第三天&#xff…

概率基础——不确定性的数学

第05篇&#xff1a;概率基础——不确定性的数学 写在前面&#xff1a;大家好&#xff0c;我是蓝皮怪&#xff01;前几篇我们聊了统计学的基本概念、数据类型、描述性统计和数据可视化&#xff0c;今天我们要进入统计学的另一个重要基础——概率论。你有没有想过&#xff0c;为什…

爬虫遇到base64编码(非常规版)

一.特征 从 Base64 的核心特性入手&#xff0c;比如它的编码原理&#xff08;将二进制数据转换为 ASCII 字符集&#xff09;和字符集的组成&#xff08;A-Z、a-z、0-9、、/ 和 &#xff09;。这是 Base64 最基础的特点&#xff0c;几乎每个回答都应该包括这些内容。基于 64 个…

节拍定时器是什么?

节拍定时器是什么&#xff1f; 节拍定时器&#xff08;SysTick Timer&#xff09;是嵌入式系统中用于提供精确时间基准的核心硬件组件&#xff0c;尤其在ARM Cortex-M系列处理器中广泛应用。以下是其关键特性和应用的综合说明&#xff1a; ⚙️ 一、核心概念与工作原理 硬件基…

SDPA(Scaled Dot-Product Attention)详解

SDPA&#xff08;Scaled Dot-Product Attention&#xff09;详解 SDPA&#xff08;Scaled Dot-Product Attention&#xff0c;缩放点积注意力&#xff09;是 Transformer 模型的核心计算单元&#xff0c;最早由 Vaswani 等人在 2017 年的论文《Attention Is All You Need》提出…

java通过hutool工具生成二维码实现扫码跳转功能

实现&#xff1a; 首先引入zxing和hutool工具依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.2</version></dependency><dependency><groupId>com.google.zxi…

数据库数据导出到Excel表格

1.后端代码 第一步&#xff1a;UserMapper定义根据ID列表批量查询用户方法 // 批量查询用户信息List<User> selectUserByIds(List<Integer> ids); 第二步&#xff1a;UserMapper.xml写动态SQL&#xff0c;实现批量查询用户 <!--根据Ids批量查询用户-->&l…

Altera系列FPGA基于ADV7180解码PAL视频,纯verilog去隔行,提供2套Quartus工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目Altera系列FPGA相关方案推荐我这里已有的PAL视频解码方案 3、设计思路框架工程设计原理框图输入PAL相机ADV7180芯片解读BT656视频解码模块图像缓存架构输出视频格式转…

【教程】Windows安全中心扫描设置排除文件

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景说明 解决方法 背景说明 即使已经把实时防护等设置全都关了&#xff0c;但Windows还是会不定时给你扫描&#xff0c;然后把风险软件给删了…

OPenCV CUDA模块立体匹配------对立体匹配生成的视差图进行双边滤波处理类cv::cuda::DisparityBilateralFilter

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::DisparityBilateralFilter 是 OpenCV CUDA 模块中的一个类&#xff0c;用于对立体匹配生成的视差图进行双边滤波处理。这种滤波方法可…

自然语言处理期末复习

自然语言处理期末复习 一单元 自然语言处理基础 两个核心任务&#xff1a; 自然语言理解&#xff08;NLU, Natural Language Understanding&#xff09; 让计算机“读懂”人类语言&#xff0c;理解文本的语义、结构和意图。 典型子任务包括&#xff1a;分词、词性标注、句法分…

黄仁勋在2025年巴黎VivaTech大会上的GTC演讲:AI工厂驱动的工业革命(上)

引言 2025年6月12日,在巴黎VivaTech大会上,英伟达创始人兼CEO黄仁勋发表了题为"AI工厂驱动的工业革命"的GTC主题演讲。这场持续约1小时35分钟的演讲不仅详细阐述了英伟达在AI基础设施、智能体技术、量子计算及机器人领域的最新突破,更系统性地勾勒出了人工智能如…

DMC-E 系列总线控制卡----雷赛板卡介绍(六)

应用软件开发方法 DMC-E 系列总线运动控制卡的应用软件可以在 Visual Basic 、 Visual C++ 、 C# 等高级语言 环境下开发。应用软件开发之前,需保证 DMC-E 系列总线运动控制卡连接好从站,通过控制 卡 Motion 的 EtherCAT 总线配置界面扫描从站、设置总线通信周期…

题目类型——左右逢源

1、针对的题目&#xff1a;&#xff08;不一定正确或完整&#xff09; 数据结构为数组之类的线性结构&#xff08;也许可以拓展&#xff09;&#xff0c;于是数组中每个元素和其他元素的相对关系为左右或前后需要对数组中每个元素求解或者说最终解要根据每个元素的解得出每个元…