SpringBoot传递单一参数时@RequestParam和@RequestBody的区
之前对这两个注解的区别,只有一个粗枝大叶的理解——@RequestParam针对单一的参数,而@RequestBody针对多个参数封装为一个对象,问了身边几个同事,大概也都是这种理解。但是,实际测试中(使用Postman),当我用@RequestParam接受String的单一参数时,前端给我传递的参数却接收不到。于是决定通过实验,彻底搞明白二者的区别(针对单一参数、且规定使用POST方式的场景)。实验的过程是分别用两个注解去接受前端传递的一个名为content的String。
实验一:使用@RequestParam注解
Controller方法代码:(省略其他部分以及返回值Result代码)
@RequestMapping(value="/requestParam", method= RequestMethod.POST, produces = "application/json;charset=UTF-8")
public Result<String> requestParam(@RequestParam("content") String content) {
System.out.println("content:"+content);
return success(new Result<String>(), content);
现在我用postman来测试几种可能的参数传递方式:
1. 在Body的raw里面传递,也是最通常的传参方式:
body-raw
结果是接收不到(不管是用text还是json等各种文本形式)!
{ "timestamp": 1544798083474,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.web.bind.MissingServletRequestParameterException",
"message": "Required String parameter 'content' is not present",
"path": "/testParam/requestParam"
}
2. 在Headers里通过key-value的形式传递。这是网上一些帖子里说的方式。
Headers方式
但结果还是接收不到!和上面一样报错400。
关于这一点,网上有些帖子里说@RequestParam的参数会写到Headers里,可见是错误的,并非在Headers里,还是在Body里。
3. 在Body的form-data里通过key-value的形式传递,可以接收!
form-data
但是,前端在传参时,是无法向这个form-data里传递参数的,所以这种方法可以被排除。
4. 在url后问号拼接参数。和很多人一样,之前一直根深蒂固地认为只有GET方式才能用url问号传参,POST方式不行,但事实证明在这里问号传参POST方式同样能接收到。如图:
问号传参
虽然能接受到参数,但前端也有统一的规范,一般不使用问号传参的方式,所以这种方法也被排除。
实验二:使用@RequestBody注解
@RequestMapping(value="/requestBody", method= RequestMethod.POST, produces = "application/json;charset=UTF-8")
public Result<String> requestBody(@RequestBody String content) {
System.out.println("content:"+content);
return success(new Result<String>(), content);
}
既然是Body,自然不能在header里传参,也不能在url里问号传参。至于Body的form-data,经测试也无效。所以,这里只有唯一一种方式,就是将参数直接写在Body的raw模式下,可以接收到,而且最好选择Text而非JSON(application/json),如图:
body
注意:这里body体里面传什么内容,后台就会原样接收,所以不要写成content: XXX这种键值对形式,而应直接把String的内容写在body体里。
总结:
对于传递单一参数(最典型的是String)的场合,最简便的方法是用GET请求。但鉴于很多项目接口统一要求使用POST方式,此时不能使用@RequestParam方式,因为此方式前端传递的参数后端无法接收;而只能采用@RequestBody注解,直接将需要的参数内容写入Body体,后端即可正常获取!

原文地址:https://bbs.csdn.net/topics/392660349
SpringBoot传递单一参数时@RequestParam和@RequestBody的区的更多相关文章
- url中传递中文参数时的转码与解码
URL传递中文参数时的几种处理方式,总结如下: 1.将字符串转码:newString(“xxxxx”.getBytes("iso-8859-1"),"utf-8" ...
- @JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化
@JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化 https://www.cnblogs.com/sup ...
- ssm的web项目,浏览器使用get方法传递中文参数时,出现乱码
ssm的web项目,浏览器使用get链接传递的为中文参数时,出现乱码 做搜索功能时,搜索手机,那么浏览器传递的参数为中文参数“手机”,但传递的默认编码格式为iso-8859-1,所以传到后台时,是乱码 ...
- mybatis 单一参数时的动态语句
public void getBookList(String publisher,String author){ Map<String,Object> maps = new HashMap ...
- JS URL传递中文参数时出现乱码的处理
在浏览器中显示的地址是这样的: 但是按F12调试的时候的地址却变化掉了: 这个肯定是是因为浏览器对url路径默认编码了.这个问题是在我们去取值的时候,得到的就是后面那一大串稀奇古怪的东西.得不到我们想 ...
- 通过url方式传递中文参数时出现的中文乱码问题的处理
1.通过url将参数[会有中文的情况]传递到另外一个页面: window.location.href = "/XXXX/XXXX?searchcontent=" + Content ...
- SpringMVC中向服务器传递时间参数时出现的问题
1. 问题描述: 今天在SpringMVC应用中上传参数的时候遇到如下问题: The request sent by the client was syntactically incorrect 这说 ...
- C#Url传递中文参数时解决方法
原文发布时间为:2008-11-05 -- 来源于本人的百度文章 [由搬家工具导入] 1.设置web.config文件。<system.web> <globalization req ...
- JavaScript onclick传递对象参数(easyui传递一行数据时)错误:uncaught SyntaxError: Unexpected identifier
JavaScript onclick传递对象参数(easyui传递一行数据时)错误:uncaught SyntaxError: Unexpected identifier 博主遇到的是用onclick ...
随机推荐
- python基础--冒泡排序
1.冒泡排序 1.首先用一张图来形象描述一下冒泡排序: 2.废话不多说,直接上代码 # 1.导入随机模块 import random # 2.定义一个列表,列表内的元素为20个100以内的随机整数 l ...
- [转] 一位ACMer过来人的心得
刻苦的训练我打算最后稍微提一下.主要说后者:什么是有效地训练? 我想说下我的理解.很多ACMer入门的时候,都被告知:要多做题,做个500多道就变牛了.其实,这既不是充分条件.也不会是必要条件. 我觉 ...
- 模拟javaWeb责任链的设计
这篇文章介绍了责任链模式的应用:本文介绍如果自己实现一个责任链 定义请求和响应信息 简单定义请求类Request(封装一个字符串) public class Request { String requ ...
- size - 列出段节大小和总共大小
总览 (SYNOPSIS) size [-A|-B|--format=compatibility] [--help] [-d|-o|-x|--radix=number] [--target=bfdna ...
- CMakeLists.txt install
本部分是关于ros CMakeLists.txt install :可参考http://wiki.ros.org/catkin/CMakeLists.txt 1.CMakeLists.txt中的in ...
- mac系统下安装和启动nginx
1.在线安装 localhost:nginx-1.17.1 mhx$ sudo brew install nginx 2.查看是否安装成功 localhost:nginx-1.17.1 mhx$ ng ...
- 【串线篇】MyBatis简介
一.MyBatis 和数据库进行交互:持久化层框架(SQL映射框架): 1).纯手工 从原始的JDBC----dbutils(QueryRunner)-------JdbcTemplate----xx ...
- java基础学习笔记六(继承)
继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父 ...
- Linux下用户-组权限配置
cat /etc/group cat /etc/ashadow 一.用户管理 1.添加用户 #useradd 用户名 useradd php100;用cat /etc/passwd查看 分析:php1 ...
- 【PowerOJ1740&网络流24题】圆桌聚餐(最大流)
题意: 来自n个不同国家的代表开会,每个国家代表数为ci 会场有m张圆桌,每张桌子可容纳mi人 不希望有同一个国家的代表在同一张桌子上就餐 设计一个合法方案 (n,m<=300) 思路:最大流, ...