用SpringBoot框架做项目时,经常需要前端给后端传递参数,如果需要多条参数,通常的做法是把这些参数封装为一个对象来传递,前端用POST方式调用。但有时会遇到后端只需要一条参数(比如一个String)的情况,此时如果还封装为一个对象,有些麻烦;最好的办法是用GET方式调用,直接把参数拼接在url后面。然而,一般项目都有统一的接口规范,要求接口都要用POST方式,此时就遇到一个问题:controller方法上到底是用@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的区的更多相关文章

  1. url中传递中文参数时的转码与解码

    URL传递中文参数时的几种处理方式,总结如下: 1.将字符串转码:newString(“xxxxx”.getBytes("iso-8859-1"),"utf-8" ...

  2. @JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化

    @JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化 https://www.cnblogs.com/sup ...

  3. ssm的web项目,浏览器使用get方法传递中文参数时,出现乱码

    ssm的web项目,浏览器使用get链接传递的为中文参数时,出现乱码 做搜索功能时,搜索手机,那么浏览器传递的参数为中文参数“手机”,但传递的默认编码格式为iso-8859-1,所以传到后台时,是乱码 ...

  4. mybatis 单一参数时的动态语句

    public void getBookList(String publisher,String author){ Map<String,Object> maps = new HashMap ...

  5. JS URL传递中文参数时出现乱码的处理

    在浏览器中显示的地址是这样的: 但是按F12调试的时候的地址却变化掉了: 这个肯定是是因为浏览器对url路径默认编码了.这个问题是在我们去取值的时候,得到的就是后面那一大串稀奇古怪的东西.得不到我们想 ...

  6. 通过url方式传递中文参数时出现的中文乱码问题的处理

    1.通过url将参数[会有中文的情况]传递到另外一个页面: window.location.href = "/XXXX/XXXX?searchcontent=" + Content ...

  7. SpringMVC中向服务器传递时间参数时出现的问题

    1. 问题描述: 今天在SpringMVC应用中上传参数的时候遇到如下问题: The request sent by the client was syntactically incorrect 这说 ...

  8. C#Url传递中文参数时解决方法

    原文发布时间为:2008-11-05 -- 来源于本人的百度文章 [由搬家工具导入] 1.设置web.config文件。<system.web> <globalization req ...

  9. JavaScript onclick传递对象参数(easyui传递一行数据时)错误:uncaught SyntaxError: Unexpected identifier

    JavaScript onclick传递对象参数(easyui传递一行数据时)错误:uncaught SyntaxError: Unexpected identifier 博主遇到的是用onclick ...

随机推荐

  1. SQL语句优化方式

    不要使用*号进行查询操作,使用具体字段. 索引 在where子句和order by 涉及的字段上合理的添加索引. where 子句优化 避免在where子句中对null值进行判断,应对字段设置默认值 ...

  2. luoguP1083 借教室(题解)(我用的线段树)

    luoguP1083 借教室 题目 #include<cstdio> #include<iostream> #include<cmath> #include< ...

  3. ConcurrentHashMap(锁分段技术)

    线程不安全的HashMap     因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap.   效率低下的HashTab ...

  4. Mac os x安装IDEAL及配置JDK和Maven

    此文章是在已安装好IDEAL前提下进行配置jdk和maven的操作文档. 1. 下载并配置JDK及Maven Mac下载并配置JDK方法: 详见Mac安装JDK和JMeter5-安装JDK Mac下载 ...

  5. c#静态变量和非静态变量的区别

    静态变量的类型说明符是static.静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成 ...

  6. Python之数字的格式化输出

    需求: 将数字格式化后输出,并控制数字的位数.对齐.千位分隔符和其他的细节 x = 1234.56789 # Two decimal places of accuracy print(format(x ...

  7. LeetCode Array Easy 219. Contains Duplicate II

    ---恢复内容开始--- Description Given an array of integers and an integer k, find out whether there are two ...

  8. C++判断字符是否是元音字母

    写这个随笔的起因很奇怪. 我本来想找找C++有没有内置的函数(类似isalpha(), isdigit(), isalnum()之流)能直接完成这个功能,但是函数没发现,却发现很多博客都是逐个字符判断 ...

  9. 转载:对比Angular/jQueryUI/Extjs:没有一个框架是万能的

    Angular不能做什么?对比Angular/jQueryUI/Extjs 框架就好比兵器,你得明白你手里拿的是屠龙刀还是倚天剑,刀法主要是砍,剑法主要是刺.对于那些职业喷子和脑残粉,小僧送你们两个字 ...

  10. Codeforces 360D Levko and Sets (数论好题)

    题意:有一个长度为n的数组a和一个长度为m的数组b,一个素数p.有n个集合,初始都只有一个1.现在,对(i从1到n)第i个集合执行以下操作: 对所有集合中的元素c,把c * (a[i] ^ b[j]) ...