springboot中的@RequestBody和@RequestParam

记录请求传递与接收的方式:

遇到了两个get请求,都是使用实体类接收参数,发现一个请求没有用@RequestBody注解,一个用了注解。根据国际惯例,先看看网友怎么说。


结果:

默认情况下,不添加任何注解 和使用 @RequestParam(value = “name”,required = false) 效果是一样的:

@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 接收参数.

@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

在这里插入图片描述

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值