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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;核心密码保护…