http报文的content-type参数和spring mvc传参问题
很早之前博主聊过HTTP的报文结构以及其中和传参相关的重要参数content-type还有spring mvc,以前的三篇文章:
HTTP与HTTPS协议详解:基础与安全机制-CSDN博客
详解Http的Content-Type_content-type application-CSDN博客
如何在Spring Boot中使用Spring MVC_springboot引入springmvc-CSDN博客
今天把这几部分内容合起来,从根源上聊清楚http的参数以及spring mvc的传参问题。
目录
1.content-type
2.Spring MVC传参
2.1.设计思想
2.1.零散参数
2.2.封装成实体
2.3.json
1.content-type
要聊SpringMVC的传参,就要先搞清楚HTTP报文是如何传参的。最熟悉的陌生人HTTP报文结构:

HTTP天天都在用,报文结构估计很多人其实记忆都不是很清晰。HTTP报文分为三部分:
-
请求行,记录method、URL、http协议版本。
-
请求头,以kv键值对记录一些附加消息,如cookie。
-
请求数据,也叫请求体,专门拿来装数据的的。
整个HTTP协议里约定了HTTP报文中可以用来传请求参数的地方:
-
URL
-
请求体
URL中的参数是以固定的格式表述的,比如:
http://example.com/api/data?param1=value1¶m2=value2
由于URL中的参数格式是固定的,所以请求的参数是很容易被解析出来的,无非就是以&和=这两个符号做一下分割就把参数的名称和值解析出来了。但是请求体中的参数格式是不固定的,有可能是json、有可能是xml、也有可能是二进制等等。所以要在请求头中加一个附加消息用来阐述请求体中的参数格式,这个附加信息就是——content-type。
常见的content-type类型:
-
application/json,用来声明请求体中参数是json格式。
-
application/xml 或 text/xml,用来声明请求体中参数是xml格式。
-
application/x-www-form-urlencoded,用来声明请求体中参数是URL参数格式,html表单用的就是这种格式来传参。
这里展开聊聊content-type=application/x-www-form-urlencoded,也就是html表单是如何来组织参数传递的?
<form action="/submit" method="POST" enctype="application/x-www-form-urlencoded"><label for="name">Name:</label><input type="text" id="name" name="name"><br><br><label for="email">Email:</label><input type="email" id="email" name="email"><br><br><label for="age">Age:</label><input type="number" id="age" name="age"><br><br><label for="bio">Bio:</label><textarea id="bio" name="bio"></textarea><br><br><input type="submit" value="Submit">
</form>
编码规则:
-
表单字段编码:
每个表单字段的名称和值会被编码为键值对。键和值之间用 = 连接。不同的键值对之间用 & 分隔。
-
特殊字符编码:
特殊字符(如空格、&、= 等)会被 URL 编码。例如,空格会被编码为 %20 或 +,& 会被编码为 %26,= 会被编码为 %3D。
-
请求体: 编码后的键值对会被放在 HTTP 请求体中。请求头中会包含 Content-Type: application/x-www-form-urlencoded 和 Content-Length 字段。
假设用户输入以下数据:
Name: John Doe Email: john.doe@example.com Age: 30 Bio: This is a sample bio.Name: John Doe Email: john.doe@example.com Age: 30 Bio: This is a sample bio.
在HTTP报文中数据会被组织成如下样子:
POST /submit HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded Content-Length: 83 name=John+Doe&email=john.doe%40example.com&age=30&bio=This+is+a+sample+bio.
总结一下:
HTTP协议中规定了HTTP报文中只有两个地方可以传参:URL、Body。URL中的传参格式由于是固定的所不用声明解析规则,但是body中的传参格式是不固定的,所以要通过content-type去声明参数的格式。要注意的是,这和method无关,POST请求也能通过body去传参。
2.Spring MVC传参
2.1.设计思想
任何框架出现都是为了解决实际的场景问题的,Spring MVC最核心的职责是:
-
映射请求,即将请求映射到对应的处理器(controller)
-
映射参数,即将前端传过来的参数映射到处理器具体方法的参数列表中
映射参数可能会遇到哪些场景?我们其实想一想就能理出来:
-
参数是零散的,一个个的传过来的。
-
参数是个封装好的实体对象,整个实体被传过来。
无非传参就这两种情况,然后就是携带参数的位置不同,要么URL要么Body。
所以要实现的能力无非就是:
-
参数是单个的,要去URL或者Body里面去取单个参数
-
参数是实体,去URL或者Body里面取参数映射成实体
2.1.零散参数
如果后端接口参数是零散的Spring MVC会通过参数名称自动进行匹配映射,或者通过@RequestParam注解来自定义映射:
@RestController
public class TestController {@PostMapping("/testRequestParam")public void testRequestParam(String param1,@RequestParam("param2")String param2){System.out.println("param1:"+param1+"\t"+"param2:"+param2);}
}
可匹取值的范围
-
表单(body)
-
URL
表单:

URL:

结果:

也就是说@RequestParam能取到键值对类型的传参。json除外,因为json在spring mvc中是单独处理的。
2.2.封装成实体
如果后端接口参数是实体,Spring MVC会通过参数名称自动进行实体字段和前端传参的匹配映射,可匹配映射的范围
-
表单(body)
-
URL
表单:


URL:


也就是说能映射键值对类型的传参。json除外,因为json在spring mvc中是单独处理的。
2.3.json
要注意的点是,如果json是键值对里面的value,通过参数名或者@RequestParam来取值,比如这种:


但是如果直接就是个JSON,那么必须通过@RequestBody,Json只能通过这个注解来声明,后端才能接收到:


相关文章:
http报文的content-type参数和spring mvc传参问题
很早之前博主聊过HTTP的报文结构以及其中和传参相关的重要参数content-type还有spring mvc,以前的三篇文章: HTTP与HTTPS协议详解:基础与安全机制-CSDN博客 详解Http的Content-Type_content-type application-CSDN博客 如何在Spring Boot中…...
005 公网访问 docker rocketmq
文章目录 创建自定义网络创建NameServer容器创建Broker容器正式开始启动 Nameserver 容器启动 Broker 容器并关联 Nameserverdocker exec -it rmqbroker vi /etc/rocketmq/broker.conf检查 namesrv 解析检查 Broker 注册状态Nameserver 日志Broker 日志检查容器日志手动指定 Br…...
14. LangChain项目实战1——基于公司制度RAG回答机器人
教学视频: 12. 基于Gradio搭建基于公司制度RAG_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11VXRYTErZ/ 环境配置: python版本:3.10.8 服务器:Ubuntu 依赖包requirements.txt文件内容: aiofiles23.2.1 …...
FPGA开发,使用Deepseek V3还是R1(6):以滤波器为例
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...
JVM常用概念之垃圾回收设计与停顿
在我们应用程序运行期间,我们是需要尽可能避免垃圾回收。 图1:不同垃圾回收器的设计(黄色代表STW,绿色代表并发) 实验 计算机配置 Hardware Overview:Model Name: MacBook ProModel Identifier: MacBookPro14,2Pro…...
uniapp-原生android插件开发摘要
uni-app在App侧的原生扩展插件,支持使用java、object-c等原生语言编写,从HBuilderX 3.6起,新增支持了使用uts来开发原生插件。 基础项目 UniPlugin-Hello-AS工程请在App离线SDK中查找 基础项目(App离线SDK)已经配置好了自定义插件所需要的…...
Python之参数星号(*)使用笔记
背景 在学习python时发现方法调用和方法定义会经常发现有带星号的标记,为了弄明白是怎么使用的。特此做个笔记。 一、参数符号对比速查表 符号类使用场景作用描述示例无符号函数定义/调用普通位置参数或关键字参数.def func(a, b)*函数定义收集多余位置参数为元组…...
2025年AI网络安全攻防战:挑战深度解析与全链路防御体系构建指南
2025年AI网络安全攻防战:挑战深度解析与全链路防御体系构建指南 引言:AI技术是一把双刃剑 随着ChatGPT、Sora等生成式AI技术的爆发式应用,2025年被称为“AI应用元年”。然而,AI在赋能网络安全防御的同时,也为攻击者提供了新型武器。根据瑞星《2024年中国网络安全报告》,…...
派可数据BI接入DeepSeek,开启智能数据分析新纪元
派可数据BI产品完成接入DeepSeek,此次接入标志着派可数据BI在智能数据分析领域迈出了重要一步,将为用户带来更智能、更高效、更便捷的数据分析体验。 派可数据BI作为国内领先的商业智能解决方案提供商,一直致力于为用户提供高效、稳定易扩展…...
M4 Mac mini运行DeepSeek-R1模型
前言 最近DeepSeek大模型很火,实际工作中也有使用,很多人觉得需要很好的显卡才能跑起来,至少显存需要很高,但实际上一般的核显机器也能跑起来,只不过内存要求要大,对于个人而言,实际上Mac M芯片…...
MaxKB上架至阿里云轻量应用服务器镜像市场
近日,MaxKB开源知识库问答系统已上架至阿里云轻量应用服务器镜像市场,目前是阿里云此类镜像市场中唯一推荐的AI应用镜像。 ▲图1 MaxKB已经上架至阿里云轻量应用服务器镜像市场 MaxKB是飞致云旗下开源项目,是一款基于大语言模型和RAG&…...
【UI设计——陕西红富士苹果海报分享】
陕西红富士苹果海报设计分享 为大家带来一款陕西红富士苹果的宣传海报设计。 海报以柔和的粉色为背景,营造出温馨的氛围。画面下方展示了色泽红润、形态饱满的红富士苹果,既有完整的果实,也有切开的剖面,直观呈现其诱人外观。 上…...
[KEIL]单片机技巧 01
1、查看外设寄存器的值 配合对应的芯片开发手册以查看寄存器及其每一位的意义,可以解决90%以上的单纯的片内外设bug,学会如何通过寄存器的值来排外设上的蛊是嵌入式开发从小白到入门的重要一步,一定要善于使用这个工具,而不是外设…...
【网络安全 | 渗透测试】GraphQL精讲二:发现API漏洞
未经许可,不得转载。 推荐阅读:【网络安全 | 渗透测试】GraphQL精讲一:基础知识 文章目录 GraphQL API 漏洞寻找 GraphQL 端点通用查询常见的端点名称请求方法初步测试利用未清理的参数发现模式信息使用 introspection探测 introspection运行完整的 introspection 查询可视化…...
MySQL练习
将安装包下载并上传 方法一 步骤 创建组与用户 [rootlocalhost ~]# groupadd mysql [rootlocalhost ~]# useradd -r -g mysql -s /bin/false mysql 解压安装包 [rootlocalhost ~]# tar xf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz -C /usr/local/软连接 [rootlocalh…...
Java 8 中,可以使用 Stream API 和 Comparator 对 List 按照元素对象的时间字段进行倒序排序
文章目录 引言I 示例对象II List 按时间字段倒序排序: 使用 `Stream` 和 `Comparator` 排序方法 1:使用 `Comparator.comparing`方法 2:使用 `Comparator.reversed`方法 3:自定义 `Comparator`输出结果III 注意事项**时间字段类型**:**空值处理**:IV 总结引言 案例:在线用…...
【动手实验】TCP半连接队列、全连接队列实战分析
本文是对 从一次线上问题说起,详解 TCP 半连接队列、全连接队列 这篇文章的实验复现和总结,借此加深对 TCP 半连接队列、全连接队列的理解。 实验环境 两台腾讯云服务器 node2(172.19.0.12) 和 node3(172.19.0.15&am…...
【六祎 - Note】SQL备忘录;DDL,DML,DQL,DCL
SQL备忘录 from to : 点击访问源地址...
智能AI替代专家系统(ES)、决策支持系统(DSS)?
文章目录 前言一、专家系统(ES)是什么?二、决策支持系统(DSS)是什么?1.决策支持系统定义2.决策系统的功能与特点3.决策支持系统的组成 三、专家系统(ES)与决策支持系统(D…...
比较Spring AOP和AspectJ
1. 介绍 当前有多个可用的AOP库,这些库必须能够回答许多问题: 它与我现有的或新的应用程序兼容吗?在哪里可以实施AOP?它与我的应用程序集成的速度有多快?性能开销是多少? 在本文中,我们将着眼…...
Spring Boot 异步编程
在 Spring Boot 中,异步编程可以显著提高应用程序的性能和响应能力,特别是在处理一些耗时的操作时。下面将详细介绍 Spring Boot 异步编程中异步方法的使用、线程池配置以及异步任务的监控与管理。 1. 异步方法的使用 步骤 1:启用异步支持 …...
现今大语言模型性能(准确率)比较
现今大语言模型性能(准确率)比较 表头信息:表的标题为“大语言模型性能比较结果”(英文:Table 1: Large Language Model Performance Comparison Results),表明该表是用于对比不同大语言模型的性能。列信息: 模型:列出参与比较的不同大语言模型名称,包括LLAMA3(70B)…...
(十 五)趣学设计模式 之 命令模式!
目录 一、 啥是命令模式?二、 为什么要用命令模式?三、 策略模式的实现方式四、 命令模式的优缺点五、 命令模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…...
React低代码项目:问卷编辑器 I
问卷编辑器 Date: February 20, 2025 4:17 PM (GMT8) 目标 完成问卷编辑器的设计和开发完成复杂系统的 UI 组件拆分完成复杂系统的数据结构设计 内容 需求分析技术方案设计开发 注意事项: 需求指导设计,设计指导开发。前两步很重要页面复杂的话&…...
信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效
随着数据传输、存储及信息技术的飞速发展,信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切,数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范,针对于涉及重要秘密信息,需做到安全的物…...
使用Python自动生成图文并茂的网页分析报告
在数据分析中,不管是市场研究还是科学分析,经常需要使用Python进行数据分析并生成图表报告。一般使用Python生成和展示图表时都是使用matplotlib 库生成静态图片文件,这种方式不便之处是不方便跟动态文字段落结合在一起,也不方便分…...
uniapp 系统学习,从入门到实战(七)—— 网络请求与数据交互
全篇大概 3600 字(含代码),建议阅读时间 25min 📚 目录 使用uni.request发起请求封装全局请求工具破解跨域难题总结 在跨平台应用开发中,网络请求是连接前端与后端服务的核心环节。UniApp 提供了 uni.request 方法处理网络请求,但…...
【项目管理】基于 C 语言的 QQ 聊天室实现(TCP + 多线程 + SQLite3)
基于 C 语言的 QQ 聊天室(TCP + 多线程 + SQLite3) 项目功能基础功能: 登录、注册、添加好友、私聊、创建群聊、群聊扩展功能: 删除好友、注销账号、好友在线状态、群管理(拉人/踢人)、VIP 特权、邮件通知等 功能介绍:模拟QQ聊天客户端:登录界面:1、登录2、注册 //将用…...
力扣27.移除元素(双指针)
题目看起来很乱,实际上意思是:把数组中值不等于val的元素放在下标为0,1,2,3......,并且返回数组中值不等于val的元素的个数 方法一:直接判断覆盖 class Solution { public:int removeElement(vector<int>& nums, int…...
VADv2: 基于矢量表征和概率规划的E2E架构
1. 写在前面 今天分享一篇自动驾驶领域的论文VADv2(End-to-End Vectorized Autonomous Driving via Probabilistic Planning), 基于矢量表征和概率规划的E2E架构,2024年2月份华中科技大和地平线合作的一篇文章, 在经典的端到端模型架构上作出了基于概率规划去输出规划轨迹的…...
