[工具類] 網絡請求HttpUtils

引言

在現代應用程序開發中,網絡請求是必不可少的功能之一。無論是訪問第三方API、微服務之間的通信,還是請求遠程數據,都需要通過HTTP協議實現。

在Java中,java.net.HttpURLConnection、Apache的HttpClient庫以及OkHttp等庫提供了豐富的HTTP請求功能,但這些API有時需要較多的樣板代碼,因此封裝一個通用的網絡請求工具類(如HttpUtils或HttpClientUtils)可以簡化開發流程,提高效率。


HttpUtils 工具類設計

HttpUtils 是一個封裝了常用HTTP請求操作的工具類,基于 Apache HttpClient 實現。這個工具類支持 GET、POST、PUT、DELETE 等常見請求方法,并提供了請求頭設置、參數傳遞、響應處理、超時設置等功能。

以下是 HttpUtils 工具類的主要功能:

  • 發送 GET 請求:用于從服務器獲取資源。
  • 發送 POST 請求:用于向服務器提交數據。
  • 發送 PUT 請求:用于更新服務器上的資源。
  • 發送 DELETE 請求:用于刪除服務器上的資源。
  • 發送 PATCH 請求:對資源進行部分更新。它的主要特點是只更新資源的部分屬性,而不是像PUT那樣替換整個資源
  • 設置請求頭:支持自定義請求頭,如Content-Type、Authorization等。
  • 設置cookies
  • 超時設置:支持連接超時和讀取超時的設置。

HttpUtils 工具類的實現

import com.alibaba.fastjson2.JSONObject;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import org.apache.http.impl.client.HttpClients;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;public class HttpUtils {private static final RestTemplate REST_TEMPLATE;static {HttpComponentsClientHttpRequestFactory factory =new HttpComponentsClientHttpRequestFactory(HttpClients.custom().setMaxConnTotal(512)    // 設置整個連接池的最大連接數為 512.setMaxConnPerRoute(32)  // 設置每個路由(如相同域名)的最大連接數為 32.build());// 表示建立TCP連接的超時時間為5000毫秒(5秒)。// 若超過此時限仍未完成連接建立,將拋出ConnectTimeoutException。該設置適用于網絡延遲較高或目標服務不可達的場景?factory.setConnectTimeout(5000);// 定義從服務器讀取數據的超時時間為10000毫秒(10秒)。// 若服務器在此時限內未返回完整響應數據,將觸發SocketTimeoutException。適用于處理響應較慢的API接口?factory.setReadTimeout(10000);REST_TEMPLATE = new RestTemplate(factory);}// GET請求方法public static String executeGet(String url, JSONObject params,String contentType,Map<String, String> cookies) {return executeRequest(url, params, HttpMethod.GET.name(), contentType,cookies);}// POST請求方法public static String executePost(String url, JSONObject params,String contentType,Map<String, String> cookies) {return executeRequest(url, params, HttpMethod.POST.name(), contentType,cookies);}// PUT請求方法public static String executePut(String url, JSONObject params, String contentType,Map<String, String> cookies) {return executeRequest(url, params, HttpMethod.PUT.name(), contentType,cookies);}// DELETE請求方法public static String executeDelete(String url, JSONObject params, String contentType,Map<String, String> cookies) {return executeRequest(url, params, HttpMethod.DELETE.name(), contentType,cookies);}// PATCH請求方法public static String executePatch(String url, JSONObject params, String contentType,Map<String, String> cookies) {return executeRequest(url, params, HttpMethod.PATCH.name(), contentType,cookies);}// 原始完整參數方法保留private static String executeRequest(String url, JSONObject params,String method, String contentType,Map<String, String> cookies) {try {// 創建URL構建器UriComponentsBuilder urlBuilder = UriComponentsBuilder.fromHttpUrl(url);// 處理GET請求的參數if (HttpMethod.GET.name().equalsIgnoreCase(method)) {// 將每個參數添加到URL查詢字符串for (Map.Entry<String, Object> param : params.entrySet()) {urlBuilder.queryParam(param.getKey(), param.getValue());}// 構建最終URL并編碼特殊字符url = urlBuilder.build().encode(StandardCharsets.UTF_8).toUriString();}HttpHeaders headers = new HttpHeaders();//設置cookiesif (cookies != null) {addCookies(headers, cookies);}//設置請求體Object requestBody = prepareRequestBody(params, method, contentType, headers);//開始調用ResponseEntity<String> response = REST_TEMPLATE.exchange(url,Objects.requireNonNull(HttpMethod.resolve(method.toUpperCase())),new HttpEntity<>(requestBody, headers),String.class);if (!response.getStatusCode().is2xxSuccessful()) {throw new RuntimeException("HTTP請求失敗: " + response.getStatusCode());}return response.getBody();} catch (Exception e) {throw new RuntimeException("HTTP請求異常", e);}}private static Object prepareRequestBody(JSONObject params, String method,String contentType, HttpHeaders headers) {if (HttpMethod.GET.name().equalsIgnoreCase(method)) return null;switch(contentType.toLowerCase()) {case "application/json":headers.setContentType(MediaType.APPLICATION_JSON);return params;case "application/x-www-form-urlencoded":headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);return buildFormData(params);default:throw new IllegalArgumentException("不支持的Content-Type: " + contentType);}}private static MultiValueMap<String, String> buildFormData(JSONObject params) {MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();params.forEach((k, v) -> formData.add(k, v.toString()));return formData;}public static void addCookies(HttpHeaders headers, Map<String, String> cookies) {if (cookies != null && !cookies.isEmpty()) {List<String> cookieList = new ArrayList<>();cookies.forEach((k, v) -> cookieList.add(k + "=" + v));headers.put(HttpHeaders.COOKIE, cookieList);}}}

這是一個基于Spring框架的HTTP請求工具類,主要使用RestTemplate和Apache HttpClient實現HTTP通信功能。以下是對該工具類的詳細解析:?

1?、RestTemplate初始化

通過HttpComponentsClientHttpRequestFactory配置底層HTTP客戶端,關鍵參數包括:?

  • setMaxConnTotal(512):全局最大連接數限制?
  • setMaxConnPerRoute(32):單域名最大連接數限制?
  • setConnectTimeout(5000):TCP連接超時時間(5秒)
  • setReadTimeout(10000):數據讀取超時時間(10秒)

2、HTTP方法封裝

  • 支持GET/POST/PUT/DELETE/PATCH方法,統一調用executeRequest處理?
  • 通過HttpMethod.resolve()動態解析請求類型,避免硬編碼?

3、參數處理

  • GET請求?:參數拼接至URL,自動進行UTF-8編碼?
  • POST/PUT等請求?:根據contentType處理請求體:x-www-form-urlencoded:轉換為MultiValueMap表單數據?。application/json:直接傳遞JSON對象?

4、Cookie管理

  • addCookies()方法將Map格式的Cookie轉換為HTTP頭格式(key=value)

5、異常處理

  • 統一捕獲異常并包裝為RuntimeException
  • 檢查響應狀態碼,非2xx響應拋出明確異常?

測試用例參考

我們啟動本地xxl-job,然后訪問用戶列表查詢頁面

?相關請求參數如下

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.utils.HttpUtils;
import lombok.Data;
import org.junit.jupiter.api.Test;
import org.springframework.http.MediaType;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** Http遠程調用測試*/
public class TestHttp {// 新增嵌套實體類@Dataprivate static class UserDetail {private Integer id;private String username;private String password;}@Testpublic void testHttp() {try {//模擬請求參數JSONObject params = new JSONObject();params.put("role", -1);params.put("start",0);params.put("length",10);//模擬請求cookiesMap<String, String> cookies = new HashMap<>();cookies.put("XXL_JOB_LOGIN_IDENTITY", "7b226964223a312c22757365726e616d65223a2261646d696e222c2270617373776f7264223a226531306164633339343962613539616262653536653035376632306638383365222c22726f6c65223a312c227065726d697373696f6e223a6e756c6c7d");//開始遠程調用String str = HttpUtils.executePost("http://localhost:9000/xxl-job-admin/user/pageList",params,MediaType.APPLICATION_FORM_URLENCODED_VALUE,cookies);//解析反參System.out.println(str);JSONObject jsonObject = JSONObject.parseObject(str);JSONArray dataArray = jsonObject.getJSONArray("data");List<UserDetail> list = dataArray.toList(UserDetail.class);System.out.println(list);}catch (Exception e){e.printStackTrace();}}
}

最后成功返回數據

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

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

相關文章

基于Spring Boot的裝飾工程管理系統(源碼+論文)

一、 開發環境與技術 本章節對開發裝飾工程管理系統------項目立項子系統需要搭建的開發環境&#xff0c;以及裝飾工程管理系統------項目立項子系統開發中使用的編程技術等進行闡述。 1 開發環境 工具/環境描述操作系統Windows 10/11 或 Linux&#xff08;如 Ubuntu&#x…

【WebGPU學習雜記】數學基礎拾遺(2)變換矩陣中的齊次坐標推導與幾何理解

今天打算開始 3D 數學基礎的復習&#xff0c;本文假設你了解以下概念&#xff1a;一次多項式、矩陣、向量&#xff0c;基于以上拓展的概念 歸一化、2&#xff5e;3階矩陣的幾何意義。幾何意義結論 齊次坐標是對三維的人工的特定的升維&#xff0c;它是一個工具而已。圖形學中常…

JS前端壓縮算法——WWDHCAPOF-算法導論論文——東方仙盟算法

代碼function customCompressString(input) {// 第一步&#xff1a;將字符串轉換為ANSI碼數組并乘以位置序號let resultArray Array.from(input).map((char, index) > {const ansiCode char.charCodeAt(0);return ansiCode * (index 東方仙盟); // 位置序號從1開始});// …

linux命令less的實際應用

less 是 Linux/Unix 中交互式文件查看神器&#xff0c;相比 more 和 cat&#xff0c;它支持自由導航、搜索、高亮等強大功能&#xff0c;尤其適合處理大文件或實時日志。以下是深度應用指南&#xff1a;?一、核心優勢?less large_file.log # 秒開GB級文件&#xff08…

DAY31 整數矩陣及其運算

DAY31 整數矩陣及其運算 本次代碼通過IntMatrix類封裝了二維整數矩陣的核心操作&#xff0c;思路如下&#xff1a;數據封裝→基礎操作&#xff08;修改和獲取元素、獲取維度&#xff0c;toString返回字符串表示&#xff0c;getData返回內部數組引用&#xff09;→矩陣運算&…

飛槳深度學習環境搭建

一、安裝 PyCharm PyCharm 官網下載頁面 記得全部勾選。 二、安裝 miniconda miniconda 官網下載頁面 根據你的操作系統選擇。 記得勾選前三個。 三、安裝 CUDA 首先 nvidia-smi 查看支持最高的 CUDA 版本。 然后去 nvidia 官網下載 CUDA&#xff0c;選擇適合你的版本。 …

MySQL 8.0 OCP 1Z0-908 題目解析(37)

題目146 Choose two. Which two are true about binary logs used in asynchronous replication? □ A) The master connects to the slave and initiates log transfer. □ B) They contain events that describe all queries run on the master. □ C) They contain events …

vue element 封裝表單

背景&#xff1a; 在前端系統開發中&#xff0c;系統頁面涉及到的表單組件比較多&#xff0c;所以進行了簡單的封裝。封裝的包括一些Form表單組件&#xff0c;如下&#xff1a;input輸入框、select下拉框、等 實現效果&#xff1a; 理論知識&#xff1a; 表單組件官方鏈接&…

flutter-完美解決鍵盤彈出遮擋輸入框的問題

文章目錄1. 前言2. 借助 Scaffold 的特性自動調整3. 使用 MediaQuery 精準控制抬升高度3.1. 底部抽屜內輸入框的方案4. 注意事項5. 總結1. 前言 在 Flutter 的開發過程中&#xff0c;經常會碰到某一個頁面有個 TextField 輸入組件&#xff0c;點擊的時候鍵盤會彈起來&#xff…

機器學習筆記(四)——聚類算法KNN、Kmeans、Dbscan

寫在前面&#xff1a;寫本系列(自用)的目的是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解&#xff0c;方便自己以后快速復習&#xff0c;減少遺忘。概念部分大部分來自于機器學習菜鳥教程&#xff0c;公式部分也會參考機器學習書籍、阿里云天池。機器學習如果只啃概…

【C#】事務(進程 ID 64)與另一個進程被死鎖在鎖資源上,并且已被選作死鎖犧牲品。請重新運行該事務。不能在具有唯一索引“XXX_Index”的對象“dbo.Test”中插入重復鍵的行。

&#x1f339;歡迎來到《小5講堂》&#x1f339; &#x1f339;這是《C#》系列文章&#xff0c;每篇文章將以博主理解的角度展開講解。&#x1f339; &#x1f339;溫馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不對之處望指正&#xff01;&#…

LeetCode Hot 100 搜索二維矩陣

給你一個滿足下述兩條屬性的 m x n 整數矩陣&#xff1a;每行中的整數從左到右按非嚴格遞增順序排列。每行的第一個整數大于前一行的最后一個整數。給你一個整數 target &#xff0c;如果 target 在矩陣中&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。示例…

python畢設高分案例:基于機器學習的抑郁癥數據分析與預測系統,flask框架,算法包括XGboost模型、梯度提升樹模型等

1 緒論 1.1 課題研究背景和意義 1.1.1 研究背景 在醫療行業不斷發展的當下&#xff0c;數據量呈現出爆炸式增長&#xff0c;醫學數據的復雜性和多樣性也達到了前所未有的程度。電子病歷系統記錄了患者豐富的診療信息&#xff0c;醫學影像技術如 CT、MRI 等生成海量的圖像數據…

STM32與ADS1256多通道數據采樣原理及控制程序

好的,使用 STM32 與 ADS1256 通信讀取多通道電壓是精密數據采集的常見方案。ADS1256 是一款高精度、24 位、8 通道(或差分 4 通道)的 ΔΣ ADC,非常適合需要高分辨率的應用(如傳感器信號、醫療儀器等)。 以下是對整個過程的詳細分析及基于 STM32 HAL 庫的程序示例: 核…

Spring Boot 3.5.x 使用 SpringDoc 2 / Swagger3

這篇文章資料來自于網絡&#xff0c;對部分知識整理&#xff0c;這里只是記錄一下&#xff0c;僅供參考 為什么要用 Swagger Swagger 的核心思想是通過定義和描述 API 的規范、結構和交互方式&#xff0c;以提高 API 的可讀性、可靠性和易用性&#xff0c;同時降低 API 開發的難…

@RefreshScope 核心原理深度解析:Spring Boot 的動態魔法

讓我們通過全新的原理圖解和代碼級分析&#xff0c;揭開RefreshScope實現配置熱更新的神秘面紗&#xff01;一、工作原理全景圖&#xff08;優化版&#xff09; #mermaid-svg-50lhLlOFeSRIWnLn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px…

萬字詳解——OSI七層模型:網絡通信的完整架構解析

OSI七層模型&#xff1a;網絡通信的完整架構解析OSI&#xff08;Open Systems Interconnection&#xff09;七層模型是計算機網絡領域最基礎、最權威的參考框架。它由國際標準化組織&#xff08;ISO&#xff09;于1984年提出&#xff0c;旨在為不同廠商、不同技術的網絡設備和系…

一個人開發一個App(OpenApi)

為了少寫代碼&#xff0c;統一前后端的網絡層&#xff0c;我使用了OpenApi設計restful接口。然后用openapi-generator來生成flutter的代碼。生成go代碼用的是oapi-codegen,它對go更友好一些。 我們直接在api.yml中設計接口&#xff0c;所有的返回值與請求者都提取到components里…

光伏氣象監測系統:助力光伏發電的智慧大腦

光伏氣象監測系統&#xff1a;助力光伏發電的智慧大腦 柏峰【BF-GFQX】在全球積極推動能源轉型、大力倡導 “雙碳” 目標的當下&#xff0c;光伏發電憑借其清潔、可再生的顯著優勢&#xff0c;宛如一顆冉冉升起的新星&#xff0c;在能源領域迅速嶄露頭角&#xff0c;得以廣泛推…

SpringCloud01——項目演變、微服務遠程調用三種方式、springcloud介紹、nacos注冊中心

目錄 一、項目架構演變過程 1、單體應用架構 2、垂直應用架構 3、分布式服務架構 4、流動計算架構&#xff08;SOA架構&#xff09; 5、微服務架構 二、如何實現微服務遠程調用 1、HttpClient工具類&#xff08;springboot中&#xff09; 形式1&#xff1a;調用第三方…