http报文的content-type参数和spring mvc传参问题

news2025/4/8 18:25:56

很早之前博主聊过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&param2=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://www.coloradmin.cn/o/2309303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

14. LangChain项目实战1——基于公司制度RAG回答机器人

教学视频&#xff1a; 12. 基于Gradio搭建基于公司制度RAG_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11VXRYTErZ/ 环境配置&#xff1a; python版本&#xff1a;3.10.8 服务器&#xff1a;Ubuntu 依赖包requirements.txt文件内容&#xff1a; aiofiles23.2.1 …

FPGA开发,使用Deepseek V3还是R1(6):以滤波器为例

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…

JVM常用概念之垃圾回收设计与停顿

在我们应用程序运行期间&#xff0c;我们是需要尽可能避免垃圾回收。 图1&#xff1a;不同垃圾回收器的设计&#xff08;黄色代表STW&#xff0c;绿色代表并发&#xff09; 实验 计算机配置 Hardware Overview:Model Name: MacBook ProModel Identifier: MacBookPro14,2Pro…

uniapp-原生android插件开发摘要

uni-app在App侧的原生扩展插件&#xff0c;支持使用java、object-c等原生语言编写&#xff0c;从HBuilderX 3.6起&#xff0c;新增支持了使用uts来开发原生插件。 基础项目 UniPlugin-Hello-AS工程请在App离线SDK中查找 基础项目(App离线SDK)已经配置好了自定义插件所需要的…

派可数据BI接入DeepSeek,开启智能数据分析新纪元

派可数据BI产品完成接入DeepSeek&#xff0c;此次接入标志着派可数据BI在智能数据分析领域迈出了重要一步&#xff0c;将为用户带来更智能、更高效、更便捷的数据分析体验。 派可数据BI作为国内领先的商业智能解决方案提供商&#xff0c;一直致力于为用户提供高效、稳定易扩展…

M4 Mac mini运行DeepSeek-R1模型

前言 最近DeepSeek大模型很火&#xff0c;实际工作中也有使用&#xff0c;很多人觉得需要很好的显卡才能跑起来&#xff0c;至少显存需要很高&#xff0c;但实际上一般的核显机器也能跑起来&#xff0c;只不过内存要求要大&#xff0c;对于个人而言&#xff0c;实际上Mac M芯片…

MaxKB上架至阿里云轻量应用服务器镜像市场

近日&#xff0c;MaxKB开源知识库问答系统已上架至阿里云轻量应用服务器镜像市场&#xff0c;目前是阿里云此类镜像市场中唯一推荐的AI应用镜像。 ▲图1 MaxKB已经上架至阿里云轻量应用服务器镜像市场 MaxKB是飞致云旗下开源项目&#xff0c;是一款基于大语言模型和RAG&…

[KEIL]单片机技巧 01

1、查看外设寄存器的值 配合对应的芯片开发手册以查看寄存器及其每一位的意义&#xff0c;可以解决90%以上的单纯的片内外设bug&#xff0c;学会如何通过寄存器的值来排外设上的蛊是嵌入式开发从小白到入门的重要一步&#xff0c;一定要善于使用这个工具&#xff0c;而不是外设…

【网络安全 | 渗透测试】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…

【动手实验】TCP半连接队列、全连接队列实战分析

本文是对 从一次线上问题说起&#xff0c;详解 TCP 半连接队列、全连接队列 这篇文章的实验复现和总结&#xff0c;借此加深对 TCP 半连接队列、全连接队列的理解。 实验环境 两台腾讯云服务器 node2&#xff08;172.19.0.12&#xff09; 和 node3&#xff08;172.19.0.15&am…

【六祎 - Note】SQL备忘录;DDL,DML,DQL,DCL

SQL备忘录 from to : 点击访问源地址

智能AI替代专家系统(ES)、决策支持系统(DSS)?

文章目录 前言一、专家系统&#xff08;ES&#xff09;是什么&#xff1f;二、决策支持系统&#xff08;DSS&#xff09;是什么&#xff1f;1.决策支持系统定义2.决策系统的功能与特点3.决策支持系统的组成 三、专家系统&#xff08;ES&#xff09;与决策支持系统&#xff08;D…

比较Spring AOP和AspectJ

1. 介绍 当前有多个可用的AOP库&#xff0c;这些库必须能够回答许多问题&#xff1a; 它与我现有的或新的应用程序兼容吗&#xff1f;在哪里可以实施AOP&#xff1f;它与我的应用程序集成的速度有多快&#xff1f;性能开销是多少&#xff1f; 在本文中&#xff0c;我们将着眼…

现今大语言模型性能(准确率)比较

现今大语言模型性能(准确率)比较 表头信息:表的标题为“大语言模型性能比较结果”(英文:Table 1: Large Language Model Performance Comparison Results),表明该表是用于对比不同大语言模型的性能。列信息: 模型:列出参与比较的不同大语言模型名称,包括LLAMA3(70B)…

(十 五)趣学设计模式 之 命令模式!

目录 一、 啥是命令模式&#xff1f;二、 为什么要用命令模式&#xff1f;三、 策略模式的实现方式四、 命令模式的优缺点五、 命令模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支…

React低代码项目:问卷编辑器 I

问卷编辑器 Date: February 20, 2025 4:17 PM (GMT8) 目标 完成问卷编辑器的设计和开发完成复杂系统的 UI 组件拆分完成复杂系统的数据结构设计 内容 需求分析技术方案设计开发 注意事项&#xff1a; 需求指导设计&#xff0c;设计指导开发。前两步很重要页面复杂的话&…

信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效

随着数据传输、存储及信息技术的飞速发展&#xff0c;信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切&#xff0c;数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范&#xff0c;针对于涉及重要秘密信息&#xff0c;需做到安全的物…

【项目管理】基于 C 语言的 QQ 聊天室实现(TCP + 多线程 + SQLite3)

基于 C 语言的 QQ 聊天室(TCP + 多线程 + SQLite3) 项目功能基础功能: 登录、注册、添加好友、私聊、创建群聊、群聊扩展功能: 删除好友、注销账号、好友在线状态、群管理(拉人/踢人)、VIP 特权、邮件通知等 功能介绍:模拟QQ聊天客户端:登录界面:1、登录2、注册 //将用…

力扣27.移除元素(双指针)

题目看起来很乱&#xff0c;实际上意思是&#xff1a;把数组中值不等于val的元素放在下标为0,1,2,3......&#xff0c;并且返回数组中值不等于val的元素的个数 方法一&#xff1a;直接判断覆盖 class Solution { public:int removeElement(vector<int>& nums, int…