SpringBoot传递单一参数时@RequestParam和@RequestBody的区别小结

 更新时间:2023年08月25日 09:34:01   作者:SiegfriedG  
用SpringBoot框架做项目时,经常需要前端给后端传递参数,本文主要介绍了SpringBoot传递单一参数时@RequestParam和@RequestBody的区别,具有一定的参考价值,感兴趣的可以了解一下

用SpringBoot框架做项目时,经常需要前端给后端传递参数,如果需要多条参数,通常的做法是把这些参数封装为一个对象来传递,前端用POST方式调用。但有时会遇到后端只需要一条参数(比如一个String)的情况,此时如果还封装为一个对象,有些多余;最好的办法是用GET方式调用,直接把参数拼接在url后面。但,一般项目都有统一的接口规范,要求接口都要用POST方式,此时就遇到一个问题:controller方法上到底是用@RequestParam注解还是用@RequestBody注解?

之前对这两个注解的区别,只有一个粗枝大叶的理解——@RequestParam针对单一的参数,而@RequestBody针对多个参数封装为一个对象,问了身边几个同事,大概也都是这种理解。但是,实际测试中(使用Postman),当我用@RequestParam接受String的单一参数时,前端给我传递的参数却接收不到。于是决定通过实验,彻底搞明白二者的区别(针对单一参数、POST方法的场景)。实验的过程是分别用@RequestParam和@RequestBody两个注解去接受前端传递的一个名为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模式下,实验结果:可以接收到,如图:

body

注意:这里body体里面传什么内容,后台就会原样接收,所以不要写成content: XXX这种键值对形式,而应直接把String的内容写在body体里。

总结:

对于传递单一参数(最典型的是String)的场合,理论上最简便的方法是用GET请求。但鉴于很多项目接口统一要求使用POST方式,此时不能使用@RequestParam方式,因为此方式前端传递的参数后端无法接收;而只能用@RequestBody,直接将需要的参数内容写入Body体,后端即可正常获取!

到此这篇关于SpringBoot传递单一参数时@RequestParam和@RequestBody的区别小结的文章就介绍到这了,更多相关SpringBoot @RequestParam @RequestBody内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot ActiveMQ如何设置访问密码

    Spring Boot ActiveMQ如何设置访问密码

    这篇文章主要介绍了Spring Boot ActiveMQ如何设置访问密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot线程池和Java线程池的使用和实现原理解析

    SpringBoot线程池和Java线程池的使用和实现原理解析

    这篇文章主要介绍了SpringBoot线程池和Java线程池的用法和实现原理,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Java开发中POJO和JSON互转时如何忽略隐藏字段的问题

    Java开发中POJO和JSON互转时如何忽略隐藏字段的问题

    这篇文章主要介绍了Java开发中POJO和JSON互转时如何忽略隐藏字段的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • @RequestBody的使用案例代码

    @RequestBody的使用案例代码

    @RequestBody主要用来接收前端传递给后端的json字符串中的数据的,这篇文章主要介绍了@RequestBody的使用,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Springboot3 ResponseEntity 完全使用案例

    Springboot3 ResponseEntity 完全使用案例

    ResponseEntity是SpringBoot中控制HTTP响应的核心工具——它能让你精准定义响应状态码、响应头、响应体,相比直接返回实体类或字符串,灵活性和规范性提升一个量级,本文介绍Springboot3 ResponseEntity 完全使用教程,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Java中本地缓存的4种实现方式总结

    Java中本地缓存的4种实现方式总结

    这篇文章主要介绍了Java中本地缓存的4种实现方式,分别是基础缓存实现、GuavaLoadingCache、SpringBoot整合Caffeine和JetCache,通过实例代码,详细讲解了每种缓存技术的特点和使用方法,需要的朋友可以参考下
    2025-04-04
  • java使用多线程找出最大随机数

    java使用多线程找出最大随机数

    这篇文章主要为大家详细介绍了java使用多线程找出最大随机数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • java中a=a+1和a+=1的区别介绍

    java中a=a+1和a+=1的区别介绍

    这篇文章主要介绍了java中a=a+1和a+=1的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot中整合MyBatis-Plus的方法示例

    SpringBoot中整合MyBatis-Plus的方法示例

    这篇文章主要介绍了SpringBoot中整合MyBatis-Plus的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • spring boot 使用@Async实现异步调用方法

    spring boot 使用@Async实现异步调用方法

    本篇文章主要介绍了spring boot 使用@Async实现异步调用方法,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04

最新评论