造輪子系列:從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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84773.shtml
英文地址,請注明出處:http://en.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;于是數組中每個元素和其他元素的相對關系為左右或前后需要對數組中每個元素求解或者說最終解要根據每個元素的解得出每個元…