Java如何使用 HttpClientUtils 發起 HTTP 請求

Java如何使用 HttpClientUtils 發起 HTTP 請求

  • 一、前言
    • 1.HttpClientUtils 類概覽
    • 2.解析 HttpClientUtils 類
    • 3.使用 HttpClientUtils 類


一、前言

在現代的軟件開發中,經常需要與遠程服務器進行通信,例如獲取數據或發送數據。Apache HttpClient 是一個流行的 Java HTTP 客戶端庫,能夠簡化 HTTP 請求的發起和響應處理。本文將介紹如何使用自定義的 HttpClientUtils 類來利用 Apache HttpClient 發起 POST 請求,并且管理連接池以優化性能。

1.HttpClientUtils 類概覽

public class HttpClientUtils {// 靜態常量和變量聲明private static final int MAX_TOTAL_CONN = 600;private static final int MAX_CONN_PER_HOST = 300;private static final int SOCKET_TIMEOUT = 5000;private static final int CONNECTION_TIMEOUT = 200;private static final int CONNECTION_MANAGER_TIMEOUT = 100;private static CloseableHttpClient httpclient;private static PoolingHttpClientConnectionManager connMrg;private static String encoding = StandardCharsets.UTF_8.name();private static Logger log = LoggerFactory.getLogger(HttpClientUtils.class);private static final ScheduledExecutorService scheduledService = Executors.newScheduledThreadPool(2);// 靜態代碼塊,用于初始化 HttpClient 和連接管理器,并設置 JVM 退出時關閉 HttpClientstatic {init();destroyByJvmExit();}// 初始化連接管理器和 HttpClientprivate static void init() {connMrg = new PoolingHttpClientConnectionManager();connMrg.setMaxTotal(MAX_TOTAL_CONN);connMrg.setDefaultMaxPerRoute(MAX_CONN_PER_HOST);httpclient = HttpClients.custom().setConnectionManager(connMrg).setDefaultRequestConfig(HttpClientUtils.defaultRequestConfig()).build();// 定時任務,定期清理過期和空閑連接scheduledService.scheduleAtFixedRate(() -> {connMrg.closeExpiredConnections();connMrg.closeIdleConnections(CONNECTION_MANAGER_TIMEOUT, TimeUnit.MILLISECONDS);}, 0, CONNECTION_MANAGER_TIMEOUT, TimeUnit.MILLISECONDS);}// JVM 退出時關閉 HttpClientprivate static void destroyByJvmExit() {Runtime.getRuntime().addShutdownHook(new Thread(() -> {try {httpclient.close();} catch (IOException e) {log.error("Error closing HttpClient: {}", e.getMessage());}}));}// 創建 HttpClientContextprivate static HttpClientContext createContext() {return HttpClientContext.create();}// 創建默認的 RequestConfigprivate static RequestConfig defaultRequestConfig() {return RequestConfig.custom().setConnectTimeout(CONNECTION_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).setConnectionRequestTimeout(CONNECTION_MANAGER_TIMEOUT).build();}// 發起帶參數的 POST 表單請求,返回字符串結果public static String postWithParamsForString(String url, List<NameValuePair> params) {HttpPost httpPost = new HttpPost();try {URI uri = new URIBuilder(url).build();httpPost.setURI(uri);httpPost.setEntity(new UrlEncodedFormEntity(params, StandardCharsets.UTF_8));return executeRequest(httpPost);} catch (URISyntaxException | IOException e) {log.error("Error executing POST request: {}", e.getMessage());} finally {httpPost.releaseConnection();}return null;}// 發起 GET 請求,返回字符串結果public static String get(String url, List<NameValuePair> params) {HttpGet httpGet = new HttpGet();try {URI uri = new URIBuilder(url).setParameters(params).build();httpGet.setURI(uri);return executeRequest(httpGet);} catch (URISyntaxException | IOException e) {log.error("HTTP GET request failed", e);} finally {httpGet.releaseConnection();}return null;}// 發起 Post 請求,返回字符串結果public static String post(String url, List<NameValuePair> params) {HttpPost httpPost = new HttpPost();try {httpPost.setURI(new URI(url));httpPost.setEntity(new UrlEncodedFormEntity(params, StandardCharsets.UTF_8));return executeRequest(httpPost);} catch (URISyntaxException | IOException e) {log.error("HTTP POST request failed", e);} finally {httpPost.releaseConnection();}return null;}// 執行 HTTP 請求并處理響應private static String executeRequest(HttpUriRequest request) throws IOException {try (CloseableHttpResponse response = httpclient.execute(request, createContext())) {int statusCode = response.getStatusLine().getStatusCode();if (statusCode == HttpStatus.SC_OK) {HttpEntity entity = response.getEntity();if (entity != null) {return EntityUtils.toString(entity, encoding);} else {log.warn("Empty response entity");}} else {log.error("HTTP request failed with status code: {}", statusCode);}} catch (IOException e) {log.error("HTTP request execution failed: {}", e.getMessage());throw e;}return null;}
}

2.解析 HttpClientUtils 類

  1. 靜態常量和變量:

    • 定義了最大連接數、連接超時時間、Socket 超時時間等常量和變量。
  2. 初始化和銷毀:

    • 在靜態代碼塊中初始化了 HttpClient 和連接管理器 PoolingHttpClientConnectionManager
    • 使用 ScheduledExecutorService 定期清理過期和空閑連接。
    • destroyByJvmExit 方法中,注冊了一個 JVM 退出鉤子,確保在 JVM 關閉時關閉 HttpClient
  3. HTTP 請求方法:

    • postWithParamsForString 方法用于執行帶參數的 POST 請求。
    • 使用 HttpPost 構建請求,設置 URL 和請求參數,最終調用 executeRequest 方法執行請求。
  4. 執行請求和處理響應:

    • executeRequest 方法接收 HttpUriRequest,執行 HTTP 請求并處理響應。
    • 檢查響應的狀態碼,如果是 200(OK),則讀取響應實體并將其轉換為字符串返回。
    • 使用日志記錄錯誤和警告信息,確保代碼的健壯性和可靠性。

3.使用 HttpClientUtils 類

使用 HttpClientUtils 類可以簡化 HTTP 請求的編寫和管理,具體步驟如下:

public class Main {public static void main(String[] args) {List<NameValuePair> params = new ArrayList<>();params.add(new BasicNameValuePair("param1", "value1"));params.add(new BasicNameValuePair("param2", "value2"));String response = HttpClientUtils.postWithParamsForString("http://example.com/api", params);if (response != null) {System.out.println("Response: " + response);} else {System.err.println("Failed to execute POST request");}}
}

通過以上學習,你現在應該了解如何使用 HttpClientUtils 類來管理 HTTP 客戶端和發起請求。這種方式可以幫助你在 Java 應用中更高效地處理 HTTP 通信,同時通過連接池和定期清理機制提升性能和穩定性。

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

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

相關文章

安卓逆向經典案例——XX優品(uniapp)

uni-app逆向 uniapp的目錄結構 有一個io文件夾&#xff0c;下面有dcloud uniapp UniApp 可以用于開發 H5 應用&#xff0c;但它不僅僅局限于 H5 應用。UniApp 的特點包括&#xff1a; 1. 跨平臺&#xff1a;可以一套代碼同時生成適用于多個平臺&#xff08;如 iOS、Android、…

windows node降級到指定版本

要在Windows上將Node.js降級到指定版本&#xff0c;你可以使用nvm&#xff08;Node Version Manager&#xff09;來管理和切換不同的Node.js版本。以下是使用nvm降級Node.js的步驟&#xff1a; 如果尚未安裝nvm&#xff0c;請訪問https://github.com/coreybutler/nvm-windows …

Python學習筆記(二):函數

python英文官方文檔:https://docs.python.org/3.8/tutorial/index.html 比較不錯的python中文文檔:https://www.runoob.com/python3/python3-tutorial.html 1. 寫在前面 這幾周從實踐角度又學習了一遍python,溫故而知新,還是有蠻多心得的, 周末再看之前記的python筆記,…

Python技巧:使用enumerate函數增強你的for循環

在Python編程中&#xff0c;我們經常需要遍歷列表、元組或其他可迭代對象。然而&#xff0c;在某些情況下&#xff0c;我們可能還需要知道當前元素的索引。這時&#xff0c;enumerate函數就派上了用場。以下我們將深入探討enumerate函數的使用方法&#xff0c;并通過幾個示例來…

Java---數組

樂觀學習&#xff0c;樂觀生活&#xff0c;才能不斷前進啊&#xff01;&#xff01;&#xff01; 我的主頁&#xff1a;optimistic_chen 我的專欄&#xff1a;c語言 歡迎大家訪問~ 創作不易&#xff0c;大佬們點贊鼓勵下吧~ 前言 無論c語言還是java數組都是重中之重&#xff0…

LangChain 入門案例教程

LangChain 是一個基于 transformer 模型的語言鏈模型&#xff0c;它可以根據輸入文本生成相應的回答。下面是一個簡單的入門案例教程&#xff0c;旨在幫助您快速上手 LangChain。 1. 安裝 LangChain 首先&#xff0c;您需要安裝 LangChain。可以使用 pip 安裝&#xff1a; p…

【簡歷】湖南某一本大學:JAVA實習簡歷指導,面試通過率比較低

注&#xff1a;為保證用戶信息安全&#xff0c;姓名和學校等信息已經進行同層次變更&#xff0c;內容部分細節也進行了部分隱藏 簡歷說明 這個同學的學校是重點一本院校&#xff0c;這種學校背景我們建議大家嘗試投一下大廠&#xff0c;然后投遞主體在中廠。但是因為項目經歷…

曠野之間12 - 內容創作用的最佳大模型評測

?????? 我正在做一個項目,需要我找出最適合內容創作的 LLM。我查看了 lmsys 排行榜上的頂級模型,閱讀了其他人對這些模型的評價,查看了頂級 LLM 的模型卡,在沒有明確答案后,我決定對所有這些 LLM 進行測試,以完成不同的內容創作任務。 評估模型 我想要評估的模型…

在iPhone / iPad上輕松模擬GPS位置 AnyGo for Mac

在iPhone / iPad上輕松模擬GPS位置 AnyGo for Mac AnyGo for Mac是一款專為Mac電腦用戶設計的虛擬定位工具。它可以模擬你的GPS位置&#xff0c;讓你的設備顯示你在任何世界上的任何地方。無論你是想在游戲中虛擬移動&#xff0c;還是在社交媒體上分享虛擬的旅行照片&#xff0…

Flask+Layui開發案例教程

基于 Python 語言的敏捷開發框架_DjangoAdmin敏捷開發框架FlaskLayui版本_開發文檔 軟件產品基于 Python 語言&#xff0c;采用 Flask2.x、Layui、MySQL 等技術棧精心打造的一款集模塊化、高性能、組件化于一體的企業級敏捷開發框架&#xff0c;本著簡化開發、提升開發效率的初…

C 語言中如何實現字符串的拼接?

&#x1f345;關注博主&#x1f397;? 帶你暢游技術世界&#xff0c;不錯過每一次成長機會&#xff01; &#x1f4d9;C 語言百萬年薪修煉課程 【https://dwz.mosong.cc/cyyjc】通俗易懂&#xff0c;深入淺出&#xff0c;匠心打磨&#xff0c;死磕細節&#xff0c;6年迭代&…

Objective-C 中的 isa 不再是簡單的結構體指針

了解 Objective-C 中的 isa 指針內存結構 在 Objective-C 中&#xff0c;isa 指針是對象和類之間的重要橋梁。它不僅幫助運行時系統識別對象的類型&#xff0c;還參與了一些內存和性能優化。本文將深入講解 isa 指針的內存結構&#xff0c;包括其在早期和現代實現中的演變。 …

Linux使用python調用串口<Ubuntu>

要在 Ubuntu 上使用 /dev/ttyUSB0 設備編寫一個簡單的串口收發程序&#xff0c;你可以使用 Python&#xff0c;結合 pyserial 庫來實現。這種方法相對簡單&#xff0c;適用于各種串行通信任務。以下是如何在 Python 中編寫串口收發程序的步驟及代碼示例&#xff1a; 步驟 1: 安…

JWT重放漏洞攻防策略

JWT重放漏洞概述 概念&#xff1a;JWT&#xff08;JSON Web Token&#xff09;是Web應用廣泛使用的身份驗證令牌。重放攻擊&#xff1a;攻擊者截獲JWT后&#xff0c;利用其有效性冒充用戶執行操作。 重放攻擊的危害 權限濫用&#xff1a;攻擊者可越權操作&#xff0c;如非法…

ffmpeg新舊函數對比

搬運博客園“kn-zheng”大佬博客 從FFmpeg 3.0 開始 &#xff0c; 使用了很多新接口&#xff0c;對不如下&#xff1a; 1、avcodec_decode_video2() 原本的解碼函數被拆解為兩個函數avcodec_send_packet()和avcodec_receive_frame() 具體用法如下&#xff1a; old: avcodec_d…

MySQL8之mysql-community-embedded-compat的作用

MySQL8中的mysql-community-embedded-compat包的作用主要是提供MySQL服務器作為嵌入式庫時的兼容性支持&#xff0c;特別是對于那些使用庫版本18的應用程序。嵌入式MySQL服務器允許開發者將MySQL數據庫直接嵌入到他們的應用程序中&#xff0c;而無需運行獨立的MySQL服務器進程。…

Transformer 論文通俗解讀:FFN 的作用

在經過前面3節關于 Transformer 論文的解讀之后&#xff0c;相信你對提出 Transformer 架構的這篇論文有了一定的了解了&#xff0c;你可以點擊下面的鏈接復習一下前3節的內容。 《Attention is all you need》通俗解讀&#xff0c;徹底理解版&#xff1a;part1 《Attention …

合合信息“大模型加速器”亮相2024世界人工智能大會

文章目錄 &#x1f4d1;引言一、大模型發展的挑戰數據稀缺問題 二、大模型“加速器”解決方案概述文檔解析引擎的特征 三、文檔解析引擎的優勢3.1 高速處理能力3.2 智能理解文檔結構3.3 多種數據類型支持3.4 高精度數據提取3.5 應用廣泛&#xff0c;適應性強 四、復雜圖表解析4…

Auslogics Disk Defrag Pro v11激活版下載、安裝、使用教程 (磁盤碎片整理工具)

前言 Auslogics Disk Defrag Pro 是一款支持 FAT16 文件系統的磁盤碎片整理工具&#xff0c;它可以快速整理磁盤碎片&#xff0c;使磁盤空間更加整潔&#xff0c;顯著提升電腦的運行速度。該軟件無需任何分析階段&#xff0c;并且速度比大多數其他碎片整理軟件更快。它可以幫助…

stm32 開發板可以拿來做什么?

STM32開發板可以用來做許多不同的事情&#xff0c;具體取決于您的應用需求和編程能力。我收集歸類了一份嵌入式學習包&#xff0c;對于新手而言簡直不要太棒&#xff0c;里面包括了新手各個時期的學習方向編程教學、問題視頻講解、畢設800套和語言類教學&#xff0c;敲個22就可…