@RequestParam和@RequestBody

前言

在开发中我们往往会使用到post、get、delete等方法去请求数据,那么我们如何接到前端传过来的数据呢。不同数据类型又如何接收呢?
我们在使用postman的时候看到五花八门的请求方法,众多的传输数据方法。
在这里插入图片描述
我们都知道在springboot中使用@RequestParam和@RequestBody去接收数据,带有时候又接收不到,或者报错,我们就来看看什么时候用@RequestParam什么时候用@RequestBody

@RequestParam

以下是spring对@RequestParam的介绍

在这里插入图片描述

spring中介绍

@RequestParam用来绑定查询参数(也就是在URL上的参数)和from data(也就是请求体,对应postman中的 from-data)的。
只要我发起请求时删除放在URL上和使用from data传参都可以使用 @RequestParam来接收

spring中详解

在这里插入图片描述

以上是spring文档中的解释,我们来逐条分析

1、 第1条说明 @RequestParam是有属性可设置的
@RequestParam注解主要的参数:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {

	@AliasFor("name")
	String value() default "";
	
	@AliasFor("value")
	String name() default "";
	
	boolean required() default true;
	
	String defaultValue() default ValueConstants.DEFAULT_NONE;

}
  • value:请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。
  • required:该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,如果设置为false时,当请求中没有此参数,将会默认为null
  • defaultValue:参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。注意默认值可以使用SpEL表达式,如"#{systemProperties[‘java.vm.version’]}"
  • name:作用同value相同
  • 这些属性是可选的,可以不设置

使用实例:

@RequestParam(value = "param",required = false,defaultValue = "12")
2、 第2条说明可以将接收到的字符串自动转化为对应的类型

Controller

@PostMapping("/test")
public R test(@RequestParam Long l,
              @RequestParam Integer i,
              @RequestParam Date date){
    return R.ok().put("l",l).put("i",i).put("date",date);
}

请求:
在这里插入图片描述

3、 第3条说明可以使用数组或者列表去接收同一个值

也就是说我们传多个一样名称的值,可以使用数组或者列表去接收
使用实例:
Cotroller:

@GetMapping("/test")
//这里的数组换成列表也是可以的
public R test(@RequestParam("name") String[] names){
    return R.ok().put("data",JSONUtil.toJsonStr(names));
}

请求:
在这里插入图片描述
这里请求换成post中的formdata也是可以的
在这里插入图片描述

4、 第4条说明可以使用Map去接收请求参数

当我们不知道传过来的是说明参数时就可以使用Map去接收
Controller

@PostMapping("/test")
public R test(@RequestParam Map<String,Object> param){
    return R.ok().put("data",param);
}

请求:
在这里插入图片描述

@RequestBody

这里是Spring对@RequestBody的解读
在这里插入图片描述
这里主要提到了两点,第一点是使用@RequestBody注解,spring会通过HttpMessageConverter去读取并且反序列化成为实体类。显然这里传的是json或者xml等类型的格式。所以@RequestBody一般使用在接收json的时候。
而且是通过HttpMessageConverter去读取的,所以这里只读取一次就可以把全部数据读取到。所以不建议同时使用多个@RequestBody。
还说了可以使用@Valid去校验数据,这里我就不多介绍了,可以去查看我校验数据那篇文章
springboot数据校验——Hibernate Validator

我们可以结合着@RequestParam来使用,使用@RequestParam来接收URL数据,使用@RequestBody来接收json数据。

总结:

  • 当同时使用@RequestParam和@RequestBody时,@RequestParam指定的参数可以是普通元素、数组、集合、对象等等(即:当,@RequestBody 与@RequestParam可以同时使用时,原SpringMVC接收参数的机制不变,只不过@RequestBody接收的是请求体里面的数据;而@RequestParam接收的是请求路径中的key-value数据,所以它会被切面进行处理,因而可以用普通元素、数组、集合、对象等接收)。
    即:如果参数时放在请求体中,以application/json的格式传入后台接口,那么后台要用@RequestBody才能接收到;如果不是放在请求体中的话,那么后台要用@RequestParam来接收,或者在形参前不贴@RequestParam注解也能接收。
  • 如果参数前写了@RequestParam(xxx),那么前端发送的请求路径中必须有对应的xxx参数才行(不管其是否有值,当然可以通过设置require属性来调节是否必须传,如@RequestParam(xxx, required = false)),如果没有xxx参数且没有设置require = false的话,那么请求会出错,报400。
  • 如果接口形参前不贴@RequestParam注解,那么请求路径中的xxx参数可有可无,如果有,会自动匹配;如果没有,请求也能正确发送。
  • 这里与feign或者openfeign消费远程调用服务不同;feign或者openfeign远程调用服务时,如果参数前什么也不写,那么会被默认是@RequestBody的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值