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&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.mzph.cn/diannao/72307.shtml

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

相关文章

‘ts-node‘ 不是内部或外部命令,也不是可运行的程序

新建一个test.ts文件 let message: string = Hello World; console.log(message);如果没有任何配置的前提下,会报错’ts-node’ 不是内部或外部命令,也不是可运行的程序。 此时需要安装一下ts-node。 npm install

《白帽子讲 Web 安全:点击劫持》

目录 摘要&#xff1a; 一、点击劫持概述 二、点击劫持的实现示例&#xff1a;诱导用户收藏指定淘宝商品 案例 构建恶意页面&#xff1a; 设置绝对定位和z - index&#xff1a; 控制透明度&#xff1a; 三、其他相关攻击技术 3.1图片覆盖攻击与 XSIO 3.2拖拽劫持与数据…

基于机器学习的图像分类综述

图像分类是计算机视觉和模式识别领域的核心任务之一,其目标是从输入的图像中自动识别并标注其所属的类别标签。基于机器学习的图像分类技术近年来取得了显著进展,尤其是在深度学习的推动下,性能得到了质的提升,并在多个实际应用中表现出色。 以下是对基于机器学习的图像分…

SQL Server 中行转列

在 SQL Server 数据库中&#xff0c;行转列在实践中是一种非常有用&#xff0c;可以将原本以行形式存储的数据转换为列的形式&#xff0c;以便更好地进行数据分析和报表展示。本文将深入浅出地介绍 SQL Server 中的行转列技术&#xff0c;并以数据表中的时间数据为例进行详细讲…

系统架构设计师—计算机基础篇—系统性能评价

文章目录 性能评价指标主频CPU时钟周期机器周期CPIMIPS 系统性能调整阿姆达尔解决方案性能优化数据库应用系统Web应用系统 性能评估方法评价程序真实程序基准测试程序核心程序小型基准程序合成基准程序 基准测试程序组 评测准确度 性能指标计算机数据库应用系统Web应用系统 性能…

web3.0简介

Web3.0&#xff08;或简称 Web3&#xff09;是近年来广泛讨论的一个新型互联网概念&#xff0c;其核心思想在于利用区块链及相关分布式技术&#xff0c;打造一个更加开放、去中心化、透明且以用户为主导的网络生态系统。这意味着在 Web3.0 时代&#xff0c;用户不再只是信息的消…

python第十一课:并发编程 | 多任务交响乐团

&#x1f3af; 本节目标 理解多线程/多进程/协程的应用场景掌握threading与multiprocessing核心用法学会使用asyncio进行异步编程开发实战项目&#xff1a;高并发爬虫引擎破解GIL锁的性能迷思 1️⃣ 并发编程三剑客 &#x1f3bb; 生活化比喻&#xff1a; 多线程 → 餐厅多个…

微服务架构实践:SpringCloud与Docker容器化部署

## 微服务架构实践&#xff1a;SpringCloud与Docker容器化部署 随着互联网应用的复杂性不断增加&#xff0c;传统的单体应用架构面临着诸多挑战&#xff0c;如难以部署、维护困难、开发效率低下等问题凸显出来。为了解决这些问题&#xff0c;微服务架构应运而生&#xff0c;它通…

SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD

目录 一、OFD 简介 1.1 什么是 OFD&#xff1f;1.2 什么是 版式文档&#xff1f;1.3 为什么要用 OFD 而不是PDF&#xff1f; 二、ofdrw 简介 2.1 定义2.2 Maven 依赖2.3 ofdrw 的 13 个模块 三、PDF/文本/图片 转 OFD&#xff08;ofdrw-conterver&#xff09; 3.1 介绍&#xf…

随机树算法 自动驾驶汽车的路径规划 静态障碍物(Matlab)

随着自动驾驶技术的蓬勃发展&#xff0c;安全、高效的路径规划成为核心挑战之一。快速探索随机树&#xff08;RRT&#xff09;算法作为一种强大的路径搜索策略&#xff0c;为自动驾驶汽车在复杂环境下绕过静态障碍物规划合理路径提供了有效解决方案。 RRT 算法基于随机采样思想…

Vscode通过Roo Cline接入Deepseek

文章目录 背景第一步、安装插件第二步、申请API key第三步、Vscode中配置第四步、Deepseek对话 背景 在前期介绍【IDEA通过Contince接入Deepseek】步骤和流程&#xff0c;那如何在vscode编译器中使用deepseek&#xff0c;记录下来&#xff0c;方便备查。 第一步、安装插件 在…

C++ 二叉树代码

二叉树代码&#xff0c;见下 #include <iostream> using namespace std;template<typename T> struct TreeNode{T val;TreeNode *left;TreeNode *right;TreeNode():val(0), left(NULL), right(NULL)TreeNode(T x):val(x), left(NULL), right(NULL){} };template&l…

leetcode第17题求电话号码组合

原题出于leetcode第17题https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/题目如下&#xff1a; 题目稍微有点复杂&#xff0c;初看会感觉特别复杂&#xff0c;首先我们需要理清思路&#xff1a; 最后的结果是字母组合&#xff0c;因此遍历的是…

Deepseek对ChatGPT的冲击?

从测试工程师的视角来看&#xff0c;DeepSeek对ChatGPT的冲击主要体现在**测试场景的垂直化需求与通用模型局限性之间的博弈**。以下从技术适配性、效率优化、风险控制及未来趋势四个维度展开分析&#xff1a; --- ### **一、技术适配性&#xff1a;垂直领域能力决定工具选择…

三十五周学习周报

目录 摘要abstract文献阅读1.1相关知识1.1.1 PSO1.1.2 BI-LSTM1.1.3 BI-GRU 1.2 整体框架1.3 实验分析 总结 摘要 在本周阅读的文献中&#xff0c;作者提出了一种创新的水文时间序列预测模型&#xff0c;其通过将粒子群优化&#xff08;PSO&#xff09;与Bi-LSTM和Bi-GRU相结合…

Git:多人协作

目录 多人协作一 准备工作 开发者1准备工作 开发者2准备工作 协作开发 将内容合并进master 多人协作二 开发者1进行工作 开发者2进行工作 特殊场景 将内容合并进master 之前所学习的Git操作&#xff0c;是为了多人协作开发做铺垫的&#xff0c;因为在公司中&#xf…

登录次数限制

文章目录 一、应用场景与设计目的1. 应用场景2. 设计目的 二、功能设计1. 登录限制规则2. 解锁机制3. 适用维度 三、技术实现1. 数据存储2. 逻辑流程3. 实现代码示例4. 动态锁定时间 四、安全增强与扩展1. 防止用户名枚举2. 加入验证码3. 监控与报警4. 分布式支持 五、设计思考…

计算机毕业设计SpringBoot+Vue.js景区民宿预约系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

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

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

Matlab 大量接单

分享一个matlab接私活、兼职的平台 1、技术方向满足任一即可 2、技术要求 3、最后 技术方向满足即可 MATLAB&#xff1a;熟练掌握MATLAB编程语言&#xff0c;能够使用MATLAB进行数据处理、机器学习和深度学习等相关工作。 机器学习、深度学习、强化学习、仿真、复现、算法、…