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.pswp.cn/web/73788.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73788.shtml
英文地址,請注明出處:http://en.pswp.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 應用…