最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Apache?HttpClient使用實(shí)例詳解

 更新時(shí)間:2025年03月26日 09:28:25   作者:kmt-碼上解決  
ApacheHttpClient是一個(gè)強(qiáng)大的Java?HTTP客戶端庫(kù),用于發(fā)送HTTP請(qǐng)求并處理響應(yīng),HttpClients提供了多種方法來(lái)創(chuàng)建和配置HTTP客戶端實(shí)例,本文給大家介紹Apache?HttpClient使用示例詳解,感興趣的朋友一起看看吧

一、Apache HttpClient 基礎(chǔ)版

HttpClients 是 Apache HttpClient 庫(kù)中的一個(gè)工具類,用于創(chuàng)建和管理 HTTP 客戶端實(shí)例。Apache HttpClient 是一個(gè)強(qiáng)大的 Java HTTP 客戶端庫(kù),用于發(fā)送 HTTP 請(qǐng)求并處理 HTTP 響應(yīng)。HttpClients 提供了多種方法來(lái)創(chuàng)建和配置 HTTP 客戶端實(shí)例。

以下是關(guān)于 HttpClients 的詳細(xì)講解:

1. Apache HttpClient 簡(jiǎn)介

Apache HttpClient 是一個(gè)開(kāi)源的 Java HTTP 客戶端庫(kù),支持 HTTP/1.1 和 HTTP/2 協(xié)議。它提供了豐富的功能,例如:

  • 發(fā)送 GET、POST、PUT、DELETE 等 HTTP 請(qǐng)求。
  • 處理 HTTP 請(qǐng)求和響應(yīng)的頭部、狀態(tài)碼、實(shí)體等。
  • 支持連接池、重試機(jī)制、代理、SSL/TLS 等高級(jí)功能。

2. HttpClients 類的作用

HttpClients 是一個(gè)工廠類,用于創(chuàng)建 CloseableHttpClient 實(shí)例。CloseableHttpClient 是 HTTP 客戶端的主要接口,用于執(zhí)行 HTTP 請(qǐng)求。

HttpClients 提供了多種靜態(tài)方法來(lái)創(chuàng)建和配置 HTTP 客戶端實(shí)例,例如:

  • 創(chuàng)建默認(rèn)的 HTTP 客戶端。
  • 創(chuàng)建自定義配置的 HTTP 客戶端。
  • 創(chuàng)建支持連接池的 HTTP 客戶端。

3. HttpClients 的常用方法

(1) HttpClients.createDefault()

  • 功能: 創(chuàng)建一個(gè)默認(rèn)的 HTTP 客戶端實(shí)例。
  • 特點(diǎn)
    • 使用默認(rèn)的配置(例如連接池、重試機(jī)制等)。
    • 適合大多數(shù)簡(jiǎn)單的 HTTP 請(qǐng)求場(chǎng)景。
  • 示例
CloseableHttpClient httpClient = HttpClients.createDefault();

(2) HttpClients.createSystem()

  • 功能: 創(chuàng)建一個(gè)基于系統(tǒng)屬性的 HTTP 客戶端實(shí)例。
  • 特點(diǎn)
    • 使用系統(tǒng)屬性(例如代理設(shè)置、超時(shí)時(shí)間等)來(lái)配置客戶端。
    • 適合需要與系統(tǒng)配置集成的場(chǎng)景。
  • 示例:
CloseableHttpClient httpClient = HttpClients.createSystem();

(3) HttpClients.custom()

  • 功能: 返回一個(gè) HttpClientBuilder 對(duì)象,用于自定義配置 HTTP 客戶端。
  • 特點(diǎn)
    • 可以設(shè)置連接池、超時(shí)時(shí)間、代理、SSL/TLS 等高級(jí)配置。
    • 適合需要精細(xì)控制的場(chǎng)景。
  • 示例
 CloseableHttpClient httpClient = HttpClients.custom()
     .setMaxConnTotal(100) // 最大連接數(shù)
     .setMaxConnPerRoute(10) // 每個(gè)路由的最大連接數(shù)
     .build();

4. HttpClients 的使用示例

以下是一個(gè)完整的示例,展示如何使用 HttpClients 發(fā)送 HTTP GET 請(qǐng)求并處理響應(yīng):

 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. 創(chuàng)建 HTTP 客戶端
         try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
             // 2. 創(chuàng)建 HTTP GET 請(qǐng)求
             HttpGet request = new HttpGet("https://jsonplaceholder.typicode.com/posts/1");
 ?
             // 3. 發(fā)送請(qǐng)求并獲取響應(yīng)
             try (CloseableHttpResponse response = httpClient.execute(request)) {
                 // 4. 檢查響應(yīng)狀態(tài)碼
                 int statusCode = response.getStatusLine().getStatusCode();
                 System.out.println("Status Code: " + statusCode);
 ?
                 // 5. 獲取響應(yīng)內(nèi)容
                 String responseBody = EntityUtils.toString(response.getEntity());
                 System.out.println("Response Body: " + responseBody);
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 }

5. HttpClients 的高級(jí)配置

通過(guò) HttpClients.custom() 方法,可以自定義 HTTP 客戶端的配置。以下是一些常見(jiàn)的配置選項(xiàng):

(1) 連接池配置

 CloseableHttpClient httpClient = HttpClients.custom()
     .setMaxConnTotal(100) // 最大連接數(shù)
     .setMaxConnPerRoute(10) // 每個(gè)路由的最大連接數(shù)
     .build();

(2) 超時(shí)配置

 RequestConfig requestConfig = RequestConfig.custom()
     .setConnectTimeout(5000) // 連接超時(shí)時(shí)間
     .setSocketTimeout(5000) // 讀取超時(shí)時(shí)間
     .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. 注意事項(xiàng)

資源釋放CloseableHttpClientCloseableHttpResponse 都實(shí)現(xiàn)了 Closeable 接口,使用后需要關(guān)閉以釋放資源。

線程安全CloseableHttpClient 是線程安全的,可以在多線程環(huán)境中共享。

性能優(yōu)化: 使用連接池和合理的超時(shí)配置可以顯著提升性能。

7. 總結(jié)

  • HttpClients 是 Apache HttpClient 庫(kù)中的一個(gè)工具類,用于創(chuàng)建和管理 HTTP 客戶端實(shí)例。
  • 它提供了多種方法來(lái)創(chuàng)建默認(rèn)或自定義配置的 HTTP 客戶端。
  • 通過(guò) HttpClients.custom() 方法,可以實(shí)現(xiàn)連接池、超時(shí)、代理、SSL/TLS 等高級(jí)配置。
  • 使用 Apache HttpClient 可以輕松發(fā)送 HTTP 請(qǐng)求并處理響應(yīng),是 Java 中處理 HTTP 請(qǐng)求的強(qiáng)大工具。

二、Apache HttpClient 高級(jí)版

1. HttpClients 類概述

HttpClients 是 Apache HttpClient 庫(kù)中的一個(gè)工廠類,用于創(chuàng)建和配置 CloseableHttpClient 實(shí)例。它是構(gòu)建 HTTP 客戶端的入口點(diǎn),支持高度自定義的 HTTP 請(qǐng)求處理,包括連接池管理、SSL/TLS 配置、重試機(jī)制等。

2. 核心方法與配置

2.1 創(chuàng)建默認(rèn)客戶端

CloseableHttpClient httpClient = HttpClients.createDefault();

特點(diǎn)

  • 使用默認(rèn)的配置(連接池、請(qǐng)求重試等)。
  • 適合簡(jiǎn)單場(chǎng)景,但擴(kuò)展性有限。

2.2 自定義配置客戶端

通過(guò) HttpClients.custom() 返回 HttpClientBuilder,允許精細(xì)化配置:

 CloseableHttpClient httpClient = HttpClients.custom()
     .setConnectionManager(connectionManager)  // 連接池管理
     .setDefaultRequestConfig(requestConfig)   // 請(qǐng)求超時(shí)配置
     .setRetryHandler(retryHandler)            // 請(qǐng)求重試策略
     .setProxy(proxy)                          // 代理設(shè)置
     .setSSLContext(sslContext)                // SSL/TLS 配置
     .build();

3. 高級(jí)配置詳解

3.1 連接池管理

連接池是提升性能的關(guān)鍵組件,避免頻繁創(chuàng)建和銷毀連接。

 PoolingHttpClientConnectionManager connectionManager = 
     new PoolingHttpClientConnectionManager();
 connectionManager.setMaxTotal(200);          // 最大總連接數(shù)
 connectionManager.setDefaultMaxPerRoute(20); // 每個(gè)路由(目標(biāo)主機(jī))的最大連接數(shù)
 ?
 CloseableHttpClient httpClient = HttpClients.custom()
     .setConnectionManager(connectionManager)
     .build();

3.2 超時(shí)配置

 RequestConfig requestConfig = RequestConfig.custom()
     .setConnectTimeout(5000)    // 連接建立超時(shí)時(shí)間(毫秒)
     .setSocketTimeout(10000)     // 數(shù)據(jù)傳輸超時(shí)時(shí)間(毫秒)
     .setConnectionRequestTimeout(2000) // 從連接池獲取連接的超時(shí)時(shí)間
     .build();
 ?
 CloseableHttpClient httpClient = HttpClients.custom()
     .setDefaultRequestConfig(requestConfig)
     .build();

3.3 重試機(jī)制

自動(dòng)重試失敗的請(qǐng)求(例如網(wǎng)絡(luò)波動(dòng)導(dǎo)致失?。?/p>

 HttpRequestRetryHandler retryHandler = (exception, executionCount, context) -> {
     if (executionCount >= 3) return false; // 最大重試次數(shù)
     if (exception instanceof NoHttpResponseException) return true; // 無(wú)響應(yīng)時(shí)重試
     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 配置

信任所有證書(僅限測(cè)試環(huán)境):

 SSLContext sslContext = SSLContexts.custom()
     .loadTrustMaterial((chain, authType) -> true) // 信任所有證書
     .build();
 ?
 CloseableHttpClient httpClient = HttpClients.custom()
     .setSSLContext(sslContext)
     .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) // 跳過(guò)主機(jī)名驗(yàn)證
     .build();

3.6 認(rèn)證機(jī)制

使用 Basic 認(rèn)證:

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

4. 請(qǐng)求與響應(yīng)處理

4.1 發(fā)送 GET 請(qǐng)求

 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 發(fā)送 POST 請(qǐng)求(JSON 數(shù)據(jù))

 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)) {
     // 處理響應(yīng)...
 }

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. 高級(jí)功能

5.1 異步請(qǐng)求

使用 HttpAsyncClients 實(shí)現(xiàn)異步非阻塞請(qǐng)求:

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

5.2 請(qǐng)求攔截器

添加自定義邏輯(如日志記錄、修改請(qǐng)求頭):

 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 管理

自動(dòng)管理 Cookie:

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

6. 最佳實(shí)踐與常見(jiàn)問(wèn)題

6.1 資源釋放

確保關(guān)閉 CloseableHttpClientCloseableHttpResponse

 try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
     try (CloseableHttpResponse response = httpClient.execute(request)) {
         // 處理響應(yīng)...
     }
 }

6.2 性能調(diào)優(yōu)

  • 連接池參數(shù):根據(jù)并發(fā)需求調(diào)整 MaxTotalDefaultMaxPerRoute。
  • 超時(shí)設(shè)置:避免因網(wǎng)絡(luò)問(wèn)題導(dǎo)致線程阻塞。
  • 重用連接:復(fù)用 HttpClient 實(shí)例而非頻繁創(chuàng)建。

6.3 錯(cuò)誤處理

  • 重試策略:針對(duì)可恢復(fù)錯(cuò)誤(如超時(shí))配置自動(dòng)重試。
  • 異常捕獲:處理 IOException、ClientProtocolException 等。

6.4 安全性

  • 生產(chǎn)環(huán)境禁用信任所有證書:使用有效 CA 簽名的證書。
  • 敏感信息保護(hù):避免在日志中打印請(qǐng)求頭或響應(yīng)體中的敏感數(shù)據(jù)。

7. 典型應(yīng)用場(chǎng)景

  • 微服務(wù)間通信:在分布式系統(tǒng)中通過(guò) HTTP 調(diào)用其他服務(wù)。
  • API 集成:調(diào)用第三方 RESTful API(如支付網(wǎng)關(guān)、地圖服務(wù))。
  • 爬蟲開(kāi)發(fā):抓取網(wǎng)頁(yè)內(nèi)容并解析數(shù)據(jù)。
  • 文件傳輸:上傳/下載文件到遠(yuǎn)程服務(wù)器。
  • 測(cè)試自動(dòng)化:模擬客戶端發(fā)送 HTTP 請(qǐng)求驗(yàn)證接口功能。

8. 官方文檔與資源

Apache HttpClient 官方文檔Apache HttpComponents – HttpClient Overview

GitHub 倉(cāng)庫(kù)https://github.com/apache/httpcomponents-client

到此這篇關(guān)于Apache HttpClient使用的文章就介紹到這了,更多相關(guān)Apache HttpClient使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Linux安裝NFS全過(guò)程

    Linux安裝NFS全過(guò)程

    這篇文章主要介紹了Linux安裝NFS全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • deepin linux 手動(dòng)升級(jí)內(nèi)核的方法

    deepin linux 手動(dòng)升級(jí)內(nèi)核的方法

    這篇文章主要介紹了deepin linux 手動(dòng)升級(jí)內(nèi)核的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 關(guān)于AIX掛載NFS寫入效率低效的解決方法

    關(guān)于AIX掛載NFS寫入效率低效的解決方法

    這篇文章主要給大家介紹了關(guān)于AIX掛載NFS寫入效率低效的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • linux 觸摸屏驅(qū)動(dòng)編寫

    linux 觸摸屏驅(qū)動(dòng)編寫

    這篇文章主要介紹了linux 觸摸屏驅(qū)動(dòng)編寫,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Ubuntu下Subversion(SVN)的快速安裝與配置詳解

    Ubuntu下Subversion(SVN)的快速安裝與配置詳解

    這篇文章主要介紹了Ubuntu下Subversion(SVN)的快速安裝與配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Linux系統(tǒng)安裝Samba服務(wù)器實(shí)現(xiàn)過(guò)程

    Linux系統(tǒng)安裝Samba服務(wù)器實(shí)現(xiàn)過(guò)程

    本文介紹了如何在CentOS7系統(tǒng)上安裝和配置Samba服務(wù)器,以實(shí)現(xiàn)Windows和Linux系統(tǒng)之間的文件共享
    2026-02-02
  • Linux使用crontab定時(shí)執(zhí)行腳本任務(wù)的流程詳解

    Linux使用crontab定時(shí)執(zhí)行腳本任務(wù)的流程詳解

    在Linux中可以使用crontab來(lái)定時(shí)執(zhí)行腳本,crontab是一個(gè)用于管理定時(shí)任務(wù)的工具,可以讓在特定的時(shí)間間隔內(nèi)自動(dòng)運(yùn)行腳本或命令,本文我們將使用cron來(lái)定期執(zhí)行一個(gè)寫入命令或腳本,需要的朋友可以參考下
    2023-10-10
  • CentOS 7 安裝vsftpd 服務(wù)器的具體操作步驟

    CentOS 7 安裝vsftpd 服務(wù)器的具體操作步驟

    下面小編就為大家?guī)?lái)一篇CentOS 7 安裝vsftpd 服務(wù)器的具體操作步驟。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Linux實(shí)現(xiàn)添加新用戶及創(chuàng)建主目錄方式

    Linux實(shí)現(xiàn)添加新用戶及創(chuàng)建主目錄方式

    這篇文章主要介紹了Linux實(shí)現(xiàn)添加新用戶及創(chuàng)建主目錄方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • centos7系統(tǒng)下python2與python3共存

    centos7系統(tǒng)下python2與python3共存

    這篇文章主要給大家介紹了關(guān)于在centos7系統(tǒng)下python2與python3共存的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用centos7爬蟲具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論

和政县| 兰溪市| 永新县| 乐山市| 隆昌县| 庆元县| 静乐县| 宁武县| 中西区| 麦盖提县| 巴楚县| 黄陵县| 南丰县| 辰溪县| 大理市| 南安市| 鄂州市| 佛冈县| 吉安市| 台东县| 顺义区| 巩留县| 长沙市| 铅山县| 清水县| 毕节市| 会昌县| 青海省| 辉南县| 钟祥市| 海晏县| 武川县| 广丰县| 隆昌县| 敦煌市| 公主岭市| 色达县| 抚宁县| 荣昌县| 延长县| 大化|