創建信任所有證書的HttpClient:Java 實現 HTTPS 接口調用,等效于curl -k

在 Java 生態中,HttpClientFeign 都是調用第三方接口的常用工具,但它們的定位、設計理念和使用場景有顯著差異。以下是詳細對比:


DIFF1. 定位與抽象層級

特性HttpClientFeign
層級底層 HTTP 客戶端庫(處理原始請求/響應)聲明式 HTTP 客戶端(基于接口和注解)
核心目標提供靈活的 HTTP 通信能力簡化 REST 客戶端開發,隱藏 HTTP 細節
依賴關系獨立使用(如 Apache HttpClient/OkHttp)需依賴 HttpClient(默認集成 Ribbon/OkHttp)

DIFF2.性能與資源**

維度HttpClientFeign
啟動開銷低(直接使用)較高(需生成動態代理類)
運行時性能更優(無額外抽象層)輕微損耗(反射/動態代理)
連接池需手動配置 PoolingHttpClientConnectionManager自動復用底層 HttpClient 連接池
本文僅對HttpClient調用https接口調用做一個總結,先上代碼:
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustAllStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;import javax.net.ssl.SSLContext;
import java.nio.charset.StandardCharsets;/*** HTTPS 接口調用工具類* 包含 GET 和 POST 請求方法,支持自定義請求頭和跳過證書驗證(僅限測試環境)*/
public class HttpsClientUtil {/*** 發送 HTTPS GET 請求* @param url 請求地址* @param headers 請求頭數組,格式為 {"key1:value1", "key2:value2"}* @return 響應內容* @throws Exception 如果請求過程中發生錯誤*/public static String doGet(String url, String[] headers) throws Exception {// 1. 創建支持 HTTPS 的 HttpClient 實例try (CloseableHttpClient httpClient = createHttpsClient()) {// 2. 創建 GET 請求對象HttpGet httpGet = new HttpGet(url);// 3. 設置請求頭(如果有)if (headers != null) {for (String header : headers) {String[] kv = header.split(":");if (kv.length == 2) {httpGet.addHeader(kv[0].trim(), kv[1].trim());}}}// 4. 執行請求并獲取響應HttpResponse response = httpClient.execute(httpGet);// 5. 解析響應內容HttpEntity entity = response.getEntity();if (entity != null) {return EntityUtils.toString(entity, StandardCharsets.UTF_8);}return null;}}/*** 發送 HTTPS POST 請求(JSON格式)* @param url 請求地址* @param jsonBody JSON格式的請求體* @param headers 請求頭數組* @return 響應內容* @throws Exception 如果請求過程中發生錯誤*/public static String doPost(String url, String jsonBody, String[] headers) throws Exception {try (CloseableHttpClient httpClient = createHttpsClient()) {// 1. 創建 POST 請求對象HttpPost httpPost = new HttpPost(url);// 2. 設置請求頭和請求體httpPost.addHeader("Content-Type", "application/json");if (headers != null) {for (String header : headers) {String[] kv = header.split(":");if (kv.length == 2) {httpPost.addHeader(kv[0].trim(), kv[1].trim());}}}// 3. 設置 JSON 請求體if (jsonBody != null) {httpPost.setEntity(new StringEntity(jsonBody, StandardCharsets.UTF_8));}// 4. 執行請求并獲取響應HttpResponse response = httpClient.execute(httpPost);// 5. 解析響應內容HttpEntity entity = response.getEntity();if (entity != null) {return EntityUtils.toString(entity, StandardCharsets.UTF_8);}return null;}}/*** 創建支持 HTTPS 的 HttpClient 實例* 注意:此方法跳過證書驗證,僅適用于測試環境!* 生產環境應使用正確的證書驗證方式*/private static CloseableHttpClient createHttpsClient() throws Exception {// 1. 創建 SSLContext,配置信任所有證書(不安全,僅測試用)SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(new TrustAllStrategy()) // 信任所有證書.build();// 2. 創建 SSL 連接工廠,跳過主機名驗證SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext,NoopHostnameVerifier.INSTANCE); // 跳過主機名驗證// 3. 配置請求超時參數RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000) // 連接超時 5秒.setSocketTimeout(10000) // 請求超時 10秒.setConnectionRequestTimeout(2000) // 從連接池獲取連接超時 2秒.build();// 4. 創建 HttpClient 實例return HttpClients.custom().setSSLSocketFactory(sslSocketFactory) // 設置 SSL 工廠.setDefaultRequestConfig(requestConfig) // 設置超時配置.build();}/*** 測試方法*/public static void main(String[] args) {try {// 測試 GET 請求String getUrl = "https://jsonplaceholder.typicode.com/posts/1";String getResponse = doGet(getUrl, null);System.out.println("GET 響應:\n" + getResponse);// 測試 POST 請求String postUrl = "https://jsonplaceholder.typicode.com/posts";String jsonBody = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";String[] headers = {"Authorization: Bearer token123"};String postResponse = doPost(postUrl, jsonBody, headers);System.out.println("\nPOST 響應:\n" + postResponse);} catch (Exception e) {e.printStackTrace();}}
}

關鍵代碼解析

1. 創建信任所有證書的 SSLContext

SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(new TrustAllStrategy()) // 信任所有證書.build();
  • TrustAllStrategy 是 Apache HttpClient 提供的策略,會信任所有證書(包括自簽名和過期證書)
  • 生產環境警告:這種配置不安全,只應在測試環境使用

2. 配置 SSL 連接工廠

SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext,NoopHostnameVerifier.INSTANCE); // 跳過主機名驗證
  • NoopHostnameVerifier 會跳過主機名驗證
  • 實際項目中應該使用 DefaultHostnameVerifier

3. 設置請求超時

RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000) // 連接超時 5秒.setSocketTimeout(10000) // 請求超時 10秒.setConnectionRequestTimeout(2000) // 從連接池獲取連接超時 2秒.build();
  • 防止因網絡問題導致線程長時間阻塞

4. 創建 HttpClient 實例

return HttpClients.custom().setSSLSocketFactory(sslSocketFactory) // 設置 SSL 工廠.setDefaultRequestConfig(requestConfig) // 設置超時配置.build();
  • 使用 try-with-resources 確保資源自動關閉

生產環境建議

  1. 不要跳過證書驗證
    應配置正確的信任庫:

    SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(new File("/path/to/truststore.jks"), "password".toCharArray()).build();
    
  2. 使用連接池
    對于高頻請求,應配置連接池:

    PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
    connManager.setMaxTotal(100);
    connManager.setDefaultMaxPerRoute(20);
    
  3. 添加重試機制
    對臨時性網絡錯誤實現自動重試

  4. 使用更現代的 HTTP 客戶端
    考慮使用 OkHttp 或 Java 11+ 的 HttpClient

這個實現提供了完整的 HTTPS 調用功能,可以直接用于項目開發(測試環境)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80883.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80883.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80883.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零基礎到最佳實踐:Vue.js 系列(7/10):《常用內置 API 與插件》

引言 Vue.js 是一款輕量且強大的前端框架,因其易用性和靈活性受到廣泛歡迎。無論是初學者還是資深開發者,都可以通過其內置 API 和插件生態快速構建高效、可維護的 Web 應用。本文將從基礎用法講起,逐步深入到進階技巧,結合大量實…

線性代數:AI大模型的數學基石

🧑 博主簡介:CSDN博客專家、CSDN平臺優質創作者,高級開發工程師,數學專業,10年以上C/C, C#, Java等多種編程語言開發經驗,擁有高級工程師證書;擅長C/C、C#等開發語言,熟悉Java常用開…

Java-System工具類深度解析

Java-System工具類深度解析 前言一、System 類概述1.1 基本定義與特點1.2 重要成員變量 二、標準輸入輸出功能2.1 標準輸入(System.in)2.2 標準輸出(System.out)2.3 標準錯誤輸出(System.err) 三、系統屬性…

刪除用戶憑證

Git 部分倉庫無法操作,部分倉庫沒問題 問題出現 我用個人電腦修改了項目,提交了git。然后第二天在公司電腦git pull的時候失敗,只有部分倉庫,git colne直接失敗,部分倉庫無問題。 解決方式 刪除git相關憑證&#xff…

19. 結合Selenium和YAML對頁面實例化PO對象改造

19. 結合Selenium和YAML對頁面實例化PO對象改造 一、架構升級核心思路 1.1 改造核心目標 # 原始PO模式:顯式定義元素定位 username (id, ctl00_MainContent_username)# 改造后PO模式:動態屬性訪問 self.username.send_keys(Tester) # 自動觸發元素定…

鴻蒙App開發學習路徑

以下是一份系統的鴻蒙(HarmonyOS)App開發學習路徑,適合從零開始逐步掌握相關技能: 1. 基礎知識儲備 1.1 理解鴻蒙系統 鴻蒙核心特性:分布式能力、一次開發多端部署、原子化服務、ArkUI框架。與Android/iOS的區別&…

spring boot啟動報錯:2002 - Can‘t connect to server on ‘192.168.10.212‘ (10061)

錯誤代碼 10061 通常表明無法建立到指定服務器的網絡連接。這個錯誤屬于 Windows Sockets 錯誤代碼,具體指的是無法建立網絡連接,通常是因為目標地址不可達。以下是一些解決此問題的步驟: 檢查 IP 地址和端口: 確保你輸入的 IP …

ARMv7的NVIC中斷優先級

1. 優先級模型 數值規則:數值越小,優先級越高(例如優先級0的異常比優先級1的異常更高);若多個異常的優先級相同,則 異常號(Exception Number) 較小的異常優先執行。固定優先級異常(不可配置):異常類型 優先級值 說明 Reset -3 最高優先級(系統復位) NMI -2 不可屏…

gitee錯誤處理總結

背景 如上圖,根據圖片中的 Git 錯誤提示,我們遇到的問題是 ?本地分支落后于遠程分支,導致 git push 被拒絕。 ?問題原因? 遠程倉庫的 master 分支有其他人推送的新提交,而您的本地 master 分支未同步這些更新(即本…

阿里云合集(不定期更新)

一、阿里云申請免費域名證書流程:https://blog.csdn.net/humors221/article/details/143266059 二、阿里云發送國內短信怎樣編程:https://blog.csdn.net/humors221/article/details/139544193 三、阿里云ECS服務器磁盤空間不足的幾個文件:h…

leetcode239 滑動窗口最大值deque方式

這段文字描述的是使用單調隊列&#xff08;Monotonic Queue&#xff09; 解決滑動窗口最大值問題的優化算法。我來簡單解釋一下&#xff1a; 核心思路 問題分析&#xff1a;在滑動窗口中&#xff0c;若存在兩個下標 i < j 且 nums[i] ≤ nums[j]&#xff0c;則 nums[i] 永遠…

小白的進階之路系列之三----人工智能從初步到精通pytorch計算機視覺詳解下

我們將繼續計算機視覺內容的講解。 我們已經知道了計算機視覺,用在什么地方,如何用Pytorch來處理數據,設定一些基礎的設置以及模型。下面,我們將要解釋剩下的部分,包括以下內容: 主題內容Model 1 :加入非線性實驗是機器學習的很大一部分,讓我們嘗試通過添加非線性層來…

elementUI 單選框存在多個互斥的選項中選擇的場景

使用 el-radio-group 來使用單選框組&#xff0c;代碼如下&#xff1a; <el-radio-group input"valueChangeHandler" v-model"featureForm.type"><el-radio name"feature" label"feature">業務對象</el-radio><…

Qt項目開發中所遇

講述下面代碼所表示的含義&#xff1a; QWidget widget_19 new QWidget(); QVBoxLayout *touchAreaLayout new QVBoxLayout(widget_19);QWidget *buttonArea new QWidget(widget_19); 1、新建一個名為widget_19的QWidget&#xff0c;將給其應用垂直管路布局。 2、新建一個…

相機標定與圖像處理涉及的核心坐標系

坐標系相互關系 #mermaid-svg-QxaMjIcgWVap0awV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QxaMjIcgWVap0awV .error-icon{fill:#552222;}#mermaid-svg-QxaMjIcgWVap0awV .error-text{fill:#552222;stroke:#552…

CICD編譯時遇到npm error code EINTEGRITY的問題

場景 CICD編譯時拋出npm error code EINTEGRITY的錯誤 npm error code EINTEGRITY npm error sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA integrity checksum failed when using sha512: wanted sha512-PlhdFcillOINfeV…

使用Spring Boot與Spring Security構建安全的RESTful API

使用Spring Boot與Spring Security構建安全的RESTful API 引言 在現代Web應用開發中&#xff0c;安全性是一個不可忽視的重要方面。Spring Boot和Spring Security為開發者提供了一套強大的工具&#xff0c;用于構建安全的RESTful API。本文將詳細介紹如何結合Spring Boot和Sp…

機器人拖動示教控制

機器人拖動示教控制 機器人拖動視角控制與軌跡記錄 1. 知識目標 體驗ES機器人拖動視角操作體驗ES機器人拖動軌跡記錄 2. 技能目標 掌握ES機器人拖動視角操作掌握ES機器人拖動軌跡記錄 3. ES機器人拖動視角操作 3.1 操作步驟 點擊“拖動視角”按鈕長按“啟用”鍵約3秒進入…

RuoYi-Vue3-FastAPI框架的功能實現(上)

RuoYi-Vue3-FastAPI框架的功能實現&#xff08;上&#xff09; 感謝大佬給出關于python后端的若依框架&#xff0c;希望這個簡單文檔能幫助到大家。 安裝與運行&#xff1a; 下載地址&#xff1a;Vue2版本&#xff1a; Gitte倉庫地址&#xff1a;RuoYi-Vue-FastAPI: 基于Vu…

Paimon和Hive相集成

Paimon版本1.17 Hive版本3.1.3 1、Paimon集成Hive 將paimon-hive-connector.jar復制到auxlib中&#xff0c;下載鏈接Index of /groups/snapshots/org/apache/https://repository.apache.org/snapshots/org/apache/paimon/ 通過flink進入查看paimon /opt/softwares/flink-1…