Spring RestTemplate + MultiValueMap vs OkHttp 多值參數的處理

📌 Spring RestTemplate vs OkHttp:多值參數處理

一、MultiValueMap 與 FormBody 的差異
特性RestTemplate + MultiValueMapOkHttp + FormBody
多值參數支持? 原生支持(add("key", "value") 自動追加)? 需顯式多次調用 add("key", "value")
參數位置控制Body 或 URL(開發者需主動區分)Body 參數強制在請求體,URL 保持干凈
編碼機制自動 URL 編碼(空格→%20自動編碼非 ASCII 字符(中文→%E4%B8%AD
適用場景Spring 生態項目,需簡化多值處理非 Spring 項目、Android 或高性能場景
性能擴展依賴底層實現(默認 JDK,可切換 OkHttp)原生支持連接池復用、HTTP/2、異步請求

關鍵誤區澄清
使用 OkHttp 的 FormBody 時,所有參數僅存在于 HTTP 請求體中,不會附加到 URL 末尾。例如:

FormBody formBody = new FormBody.Builder().add("role", "admin").build();  

實際請求結構:

POST /submit HTTP/1.1  
Content-Type: application/x-www-form-urlencoded  role=admin&role=editor  // ? 參數在 Body,URL 仍是 `https://api.example.com/submit`  

二、代碼示例:表單提交實戰對比
1. RestTemplate + MultiValueMap(支持多值參數)
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("user", "Alice");
params.add("role", "admin"); 
params.add("role", "editor"); // ? 同名參數多值HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); // 必須設置HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(params, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);
2. OkHttp FormBody(需顯式添加多值)
FormBody formBody = new FormBody.Builder().add("user", "Alice").add("role", "admin")  // 同名參數需重復調用.add("role", "editor") .build();Request request = new Request.Builder().url(url) // ? URL 無參數.post(formBody).build();OkHttpClient client = new OkHttpClient();
client.newCall(request).execute();

三、轉換方法:MultiValueMap ? FormBody
1. Spring → OkHttp(MultiValueMap → FormBody)
MultiValueMap<String, String> springParams = ...; // Spring 參數
FormBody.Builder okHttpBuilder = new FormBody.Builder();springParams.forEach((key, values) -> values.forEach(value -> okHttpBuilder.add(key, value) // 遍歷追加多值)
);
FormBody okHttpBody = okHttpBuilder.build();
2. OkHttp → Spring(FormBody → MultiValueMap)
FormBody okHttpBody = ...; // OkHttp 請求體
MultiValueMap<String, String> springParams = new LinkedMultiValueMap<>();for (int i = 0; i < okHttpBody.size(); i++) {springParams.add(okHttpBody.name(i), okHttpBody.value(i)); // 按索引解析
}

四、Spring Boot 接收 FormBody 請求(x-www-form-urlencoded)
1. 多值參數綁定方案
@PostMapping("/submit")
public String handleForm(@RequestParam("user") String user,          // 單值參數@RequestParam("role") List<String> roles     // 多值參數 → 自動綁定 List
) {return "User: " + user + ", Roles: " + roles; // 輸出:User: Alice, Roles: [admin, editor]
}
2. 通過 POJO 對象接收(需匹配字段名)
public class FormData {private String user;private List<String> role; // 字段名必須與參數名一致// 必需 Setterpublic void setRole(List<String> role) { this.role = role; }
}@PostMapping("/submit")
public String handleForm(FormData formData) {return formData.getRole().toString(); // 輸出 [admin, editor]
}
?? 關鍵注意事項
  1. Content-Type 必須為 application/x-www-form-urlencoded
    • 誤用 @RequestBody 會觸發 415 Unsupported MediaType(應用 JSON 處理器)。
  2. 多值參數綁定規則
    • 前端需傳遞同名參數(如 role=admin&role=editor),否則 Spring 無法識別多值。
  3. 中文亂碼解決方案
    @Bean
    public FilterRegistrationBean<CharacterEncodingFilter> encodingFilter() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");filter.setForceEncoding(true); // 強制覆蓋請求/響應編碼return new FilterRegistrationBean<>(filter);
    }
    

五、總結:選型建議
場景推薦方案原因
高并發/低延遲需求OkHttp原生異步、連接池、HTTP/2 支持
非 Spring 項目OkHttp無依賴,輕量易集成
簡單表單提交(Spring 內部)RestTemplate + MultiValueMap快速實現,避免額外代碼

決策建議

  • 優先 OkHttp:新項目、高性能需求、跨平臺(如 Android)或非 Spring 環境。
  • 謹慎保留 MultiValueMap:僅限 Spring 項目且需頻繁處理多值表單的場景,但底層應切換為 OkHttp 引擎。
  • 徹底棄用場景:RestTemplate 的阻塞模型無法滿足性能要求,或參數混淆風險過高時。

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

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

相關文章

GelSight視觸覺3D輪廓儀賦能Beomni人形機器人觸覺遙測,開啟人形機器人觸覺應用新場景

在智能制造、航空航天等領域&#xff0c;傳統機器人常面臨操作精度不足、環境適應力弱等問題。GelSight觸覺傳感技術與Beomni人形機器人的融合&#xff0c;為這些場景提供了新可能 —— 通過亞微米級觸覺感知能力&#xff0c;操作員可遠程感知物體表面細節&#xff0c;在復雜環…

python設置word的字體顏色

這個錯誤是由于python-docx的RGBColor對象沒有.rgb屬性導致的。正確的屬性訪問方式是分別獲取紅、綠(g)、藍(b)三個分量。以下是修復方案&#xff1a; 錯誤原因分析 RGBColor對象的結構如下&#xff1a; from docx.shared import RGBColorcolor RGBColor(255, 204, 51) pri…

推薦模型之GBDT-LR

一、概念 GBDT-LR模型由FaceBook&#xff08;現在的Meta&#xff09;團隊于2014年在論文《Practial Lessons from Predicting Clicks on Ads at Facebook》中提出&#xff0c;目標是用于預測FaceBook的廣告點擊量&#xff08;實際上廣告和推薦領域很多算法模型都是共用的&#…

Java實現Excel圖片URL篩選與大小檢測

Java實現Excel圖片URL篩選與大小檢測 在數據處理場景中&#xff0c;我們常需篩選Excel中的圖片URL。本文分享一個完整的Java方案&#xff0c;涵蓋從讀取圖片URL到檢測有效性、篩選大小&#xff0c;再到生成新Excel文件的全過程&#xff0c;同時講解開發與優化過程&#xff0c;…

Java 實現后端調用 Chromium 瀏覽器無頭模式截圖的方案

Java 實現后端調用 Chromium 瀏覽器無頭模式截圖的方案 1. 使用 Playwright 優點&#xff1a;功能強大、支持多瀏覽器&#xff08;Chromium/Firefox/WebKit&#xff09;、支持異步操作。實現方式&#xff1a; 利用 Playwright 創建無頭瀏覽器實例&#xff1b;使用 Java 的調度…

基于多模態文檔解析與RAG的行業知識庫構建技術指南

1. 技術背景 隨著企業非結構化數據&#xff08;掃描件、PDF、圖像等&#xff09;占比超過80%&#xff0c;傳統關鍵詞檢索已無法滿足精準問答需求。本文提出融合**計算機視覺&#xff08;CV&#xff09;與大語言模型&#xff08;LLM&#xff09;**的解決方案&#xff0c;關鍵技…

基于YOLOv11+PP-OCRv5深度學習的智能車牌檢測與識別系統python源碼+pytorch模型+評估指標曲線+精美GUI界面

【算法介紹】 智能車牌檢測與識別系統借助當下前沿的 YOLOv11 算法以及 PP-OCRv5 算法&#xff0c;能夠在復雜多樣的環境場景中&#xff0c;快速且精準地達成實時車牌檢測與識別任務。在現代交通管理領域&#xff0c;該技術意義重大&#xff0c;它能夠推動涉及車輛識別與記錄的…

[深度學習]全連接神經網絡

目錄 一、實驗目的 二、實驗環境 三、實驗內容 3.1 完成解壓數據集相關操作 3.2分析代碼結構并運行代碼查看結果 3.3修改超參數&#xff08;批量大小、學習率、Epoch&#xff09;并對比分析不同結果 3.4修改網絡結構&#xff08;隱藏層數、神經元個數&#xff09;并對比分…

openEuler安裝BenchmarkSQL

BenchmarkSQL是一個用于評估數據庫性能的開源工具。它模擬TPC-C&#xff08;Transaction Processing Performance Council&#xff09;基準測試場景&#xff0c;該場景主要用于衡量數據庫在處理大量并發事務時的能力。TPC-C測試場景模擬了一個典型的批發分銷商的業務環境&#…

分庫分表之優缺點分析

大家好&#xff0c;我是工藤學編程 &#x1f989;一個正在努力學習的小博主&#xff0c;期待你的關注實戰代碼系列最新文章&#x1f609;C實現圖書管理系統&#xff08;Qt C GUI界面版&#xff09;SpringBoot實戰系列&#x1f437;【SpringBoot實戰系列】Sharding-Jdbc實現分庫…

【2025年超詳細】Git 系列筆記-4 git版本號及git相關指令運用。

系列筆記 【2025年超詳細】Git 系列筆記-1 Git簡述、Windows下git安裝、Linux下git安裝_displaying 2e144 commits. adjust this setting in -CSDN博客 【2025年超詳細】Git 系列筆記-2 github連接超時問題解決_2025訪問github-CSDN博客 【2025年超詳細】Git 系列筆記-3 Git…

圖像特征檢測算法SuperPoint和SuperGlue

SuperPoint 背景與概述 &#xff1a;SuperPoint 是一個自監督的全卷積神經網絡&#xff0c;用于提取圖像中的興趣點及其描述子。它在 2018 年由 Magic Leap 提出&#xff0c;通過在合成數據集上預訓練一個基礎檢測器 MagicPoint&#xff0c;然后利用同胚適應技術對真實圖像數據…

nginx 和 springcloud gateway cors 跨域如何設置

在跨域資源共享(CORS)配置中,Nginx 和 API Gateway(如Spring Cloud Gateway、Kong等)是兩種常見的解決方案,它們的配置邏輯和適用場景有所不同。以下是詳細對比和配置示例: 一、核心區別 維度NginxAPI Gateway定位反向代理/Web服務器微服務流量入口配置位置基礎設施層應…

電路筆記(信號):一階低通RC濾波器 一階線性微分方程推導 拉普拉斯域表達(傳遞函數、頻率響應)分析

目錄 RC 低通濾波器電路一階線性微分方程推導拉普拉斯域表達&#xff08;傳遞函數&#xff09;傳遞函數 H ( s ) H(s) H(s)頻率響應&#xff08;令 s j ω s j\omega sjω&#xff09;幅頻特性&#xff1a;相位特性&#xff1a;Bode 圖&#xff08;線性系統頻率響應&#x…

【Git】刪除遠程分支時,本地分支還能看到

當遠程倉庫的分支被刪除后&#xff0c;本地通過 git branch -a 或 git remote show origin 仍能看到這些分支的引用&#xff0c;是因為本地存儲的遠程跟蹤分支&#xff08;位于 refs/remotes/origin/&#xff09;未被同步更新。以下是解決方法&#xff1a; 解決方案&#xff1…

Cubase 通過 MIDIPLUS MIDI 鍵盤進行走帶控制的設置方法

第一步&#xff0c;在官網下載xml配置文件。 https://midiplus.com/upload/202101/29/Xpro & Xpro_mini控制腳本(Cubase).zip 第二步&#xff0c;Cubase中按如圖步驟添加映射。 將MIDI鍵盤連接到電腦后打開Cubase軟件&#xff0c;點選菜單“工作室”->“工作室設置”&…

第十八章 Linux之Python定制篇——Python開發平臺Ununtu

1. Ubuntu介紹 Ubuntu&#xff08;友幫拓、優般圖、烏班圖&#xff09;是一個以桌面應用為主的開源GUN/Linux操作系統&#xff0c;Ubuntu基于GUN/Linux&#xff0c;支持x86、amd64&#xff08;即x64&#xff09;和ppc架構&#xff0c;有全球專業開發團隊&#xff08;Canonical…

推薦輕量級文生視頻模型(Text-to-Video)

1. ModelScope T2V by 阿里達摩院&#xff08;推薦&#xff09; 模型名&#xff1a;damo/text-to-video-synthesis 輸入&#xff1a;一句文字描述&#xff08;如&#xff1a;"a panda is dancing"&#xff09; 輸出&#xff1a;2秒視頻&#xff08;16幀&#xff0c…

流編輯器sed

sed簡介 sed是一種流編輯器&#xff0c;處理時&#xff0c;把當前處理的行存儲在臨時緩沖區中&#xff0c;稱為模式空間&#xff0c;接著用sed命令處理緩沖區中的內容&#xff0c;處理完成后&#xff0c;把緩沖區的內容送往屏幕。接著處理下行&#xff0c;這樣不斷重復&#xf…

商用密碼基礎知識介紹(上)

一、密碼的基礎知識 1、密碼分類 根據《中華人民共和國密碼法》&#xff0c;國家對密碼實行分類管理&#xff0c;分為密碼分為核心密碼、普通密碼和商用密碼。 &#xff08;1&#xff09;核心密碼、普通密碼 核心密碼、普通密碼用于保護國家秘密信息&#xff0c;核心密碼保護…