0


@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)@Documentedpublic@interfaceRequestParam{@AliasFor("name")Stringvalue()default"";@AliasFor("value")Stringname()default"";booleanrequired()defaulttrue;StringdefaultValue()defaultValueConstants.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")publicRtest(@RequestParamLong l,@RequestParamInteger i,@RequestParamDate date){returnR.ok().put("l",l).put("i",i).put("date",date);}

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

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

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

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

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

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

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

@PostMapping("/test")publicRtest(@RequestParamMap<String,Object> param){returnR.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的。

本文转载自: https://blog.csdn.net/qq_46110252/article/details/127783557
版权归原作者 五更钟动 所有, 如有侵权,请联系我们删除。

“@RequestParam和@RequestBody”的评论:

还没有评论