不用在纠结使用 @RequestBody 还是 @RequestParam
因为前段时间一位同事,问了我接口获取不到参数的问题.
所以今天想用最简单的方式来解释回答这个问题!
刚开始工作的时期,自己确实也遇到过这种问题.上网搜索了很久,虽然解决了当时的问题但没有继续深入了解,后期遇到同样的问题依旧被耽误了很长时间.
在网上经常看到有人提问,get请求怎么接收参数,post请求... 很多类似这种的提问,当然确实解决了你的问题,但这次我们要深入探究,彻底搞清楚.
默认情况
默认情况下,不添加任何注解 和使用 @RequestParam(value = "name",required = false) 效果是一样的,让我们接下来去验证吧
后台示例代码:
[code]@RestController public class TestController { @GetMapping("testParams") public JsonData testParams(String name, Integer age) { return JsonData.okMsg("参数 : " + name + " , " + age); } }
queryString方式: ?age=35&name=王小二
全参数请求:
单参数请求:
以上说明 参数可以不是必填的 ,@RequestParam 注解 指定的参数默认是必填的
请求体方式: json
虽然是get请求 ,但是依旧可以通过 body 请求体传参
注意:
下图可以看出 get请求 也可以通过请求体 接收到参数 在使用@RequestBody时 ,可以接收到get请求的请求体
嗯~~(卖个萌) 再演示个post请求吧, 有点懒
后台示例代码:
在使用post请求时 肯定都看过说 post请求要使用 @RequestBody 接收参数.
[code]@RestController public class TestController { @PostMapping("testParams") public JsonData testParams(@RequestBody Map<String, String> map) { return JsonData.okMsg("参数 : " + JsonUtils.objectToJson(map)); } }
请求示例:
上图很正常 什么意外也没有发生,咱们继续...
post请求 也可以用@RequestParam, 看的烦了吧 结局说来就来
这个时候我可以写总结了
其实呢 接收参数 和请求方法没有什么直接关系
- @RequestParam 就是从 queryString 获取参数, @RequestBody 就是从请求体里获取参数 ,但是要注意@RequestBody 接收的是json 所以要用实体类或者map接收,即使是一个参数.
- 不使用任何注解的时候,默认同@RequestParam(required = false) 一样 ,而且Controller参数名 要和 queryString 的key 一致,如果不一致就要使用 @RequestParam 了
题外知识:
- 有的时候 想把 queryString中的数据放到map里面,这时候必须加@RequestParam. 如下图操作:
- 想把 queryString 中的数据放到实体类呢? 如下图操作
发现了吗,不需要任何注解, 但是实体类的字段名 必须和 queryString 的key 必须一致, 还有就是使用过 jackson都应该知道 @JsonProperty() 别名注解,在使用实体类接收queryString时 别名是无效的
- 有时候做文件上传时会用FormData, 大家应该不陌生 这个也是通过请求体传输过去的 但是这里不能使用 @RequestBody 而是使用@RequestParam
上文说过@RequestParam 是获取queryString中的数据 , 主要是为了让大家更直观的看明白, 其实@RequestParam 是从SpringMVC中的 requestParam中获取, 而queryString 和 FormData 传递数据会被SpringMVC 解析到 requestParam,所以使用@RequestParam获取.
而一般的请求体是不会解析到 requestParam中的 因此需要使用@RequestBody
- 注解@RequestParam与@RequestBody,@PathVariable的使用介绍
- @RequestBody 和 @RequestParam可以同时使用
- @RequestParam 和@RequestBody的使用方式
- @RequestBody和@RequestParam、@ResponseBody的使用
- @PathVariable、@RequestParam、@RequestBody的使用
- SpringMVC使用@PathVariable,@RequestBody,@ResponseBody,@RequestParam,@InitBinder
- 注解@RequestParam与@RequestBody的使用场景
- AJAX data参数及后台接收注释 @RequestBody @RequestParam 的使用
- Spring MVC 在@RequestParam和@RequestBody中使用Java 8时间LocalDateTime
- @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
- spring mvc @RequestBody和@RequestParam区别
- @RequestParam @RequestBody @PathVariable 等参数绑定注解详解(转)
- Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解
- @RequestParam注解的使用
- spring boot的@RequestParam和@RequestBody的区别
- Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法
- @RequestParam @RequestBody @PathVariable 等参数绑定注解详解(转载)
- SpringMvc @RequestParam 使用推荐使用包装类型代替包装类型
- Spring,@Controller,@RequestMapping, @ResponseBody,@RequestParam
- [@Controller]3 详解@CookieValue,@PathVariable,@RequestBody,@RequestHeader,@RequestParam