@RequestBody
@RequestBody主要用来接收前端传过来的json字符串中的数据(请求体的数据)
Get请求没有方法体,所以使用@RequestBody接受数据时,前端不能使用Get方式提交数据,而且使用Post方式提交。
在后端的一个接受请求中,@RequestBody和@RequestParam是可以同时使用的。
- 一个请求只有一个@RequestBody,但是可以有多个@RequestParam
- @RequestParam 注解接收的参数是来自于 requestHeader 中,即请求头。都是用来获取请求路径 url 中的动态参数。也就是在 url 中,格式为 xxx?username=123&password=456。
@RequestBody 注解接收的参数则是来自于 requestBody 中,即请求体中。
@RequestParam
RequestParam用于将请求参数区域的数据映射到控制层功能处理方法的参数上
主要参数用法
@RequestParam(value="参数名", required="true/false", defaultValue="") 1.value:请求参数中传入参数的名称,如果不设置后台接口的value值,则会默认参数名称就是该变量名。 2.required:是否保安该参数,默认为true,表示该请求路径中必须包含该参数,不包含就报404.如果设置为false, 当请求里没有此参数,将会默认为null, 而对于基本数据类型的变量,则必须有值,这时会报空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。 3.defaultValue:默认参数值,如果设置了该值,required=true 将失效,自动为 false,如果没有传该参数,就使用默认值。
@RequestParam()指定的参数可以是普通元素,数组,集合,对象等。
@RequestBody接受的是请求体里的数据,而RequestParam接受的是
key-value 里的参数,所以它会被切片进行处理从而可以用普通元素,数组,集合,对象等
如果参数写在请求体中传入后台,那么后台要用@RequestBody才能接收到。
如果不是放在请求体中的话,那么后台要用@RequestParam接受(形参前什么也不写也能接收)
注:如果参数前写了 @RequestParam(xxx),那么前端必须有对应的 xxx 名字才行
(不管其是否有值,当然可以通过设置该注解的 required 属性来调节是否必须传)
如果没有 xxx 名的话,那么请求会出错,报400。注:如果参数前不写 @RequestParam(xxx) 的话,那么就前端可以有可以没有对应的 xxx 名字才行,
如果有 xxx 名的话,那么就会自动匹配;没有的话,请求也能正确发送。
@PathVariable
@PathVariable接受请求路径中占位符的值
@PathVariable注解可以将URL中占位符参数绑到控制器处理方法的入参中;URL中的{xxx}占位符可以通过
@PathVariable("xxx")绑定到操作方法的入参中
- @RequestParam 和 @PathVariable 注解是用于从 request 中接收请求的,两个都可以接收参数,关键点不同的是 @RequestParam 是从 request 里面拿取值,而 @PathVariable 是从一个 url 模板里面来填充。
- @RequestParam 注解是获取静态 url 传入的参数
@PathVariable 是获取请求路径中的变量作为参数,需要和 @RequestMapping(“item/{itemId}”) 配合使用。
@RequestAttribute
@RequestAttribute注解的参数在项目里是自己解析出来的,并不是前端传递的。具体一点,在项目里的拦截器里会对Token信息进行解析,解析出来的参数重新放在请求里(用httpServletRequest.setAttribute(name, value)),后边接口接收参数时就用这个注解。
@RequestAttribute只负责从request里面取属性值,至于你什么时候往里放值,是有多种方式的可以达到的
我们一般前后端分离开发每次请求都会携带一些固定的参数,例如: 租户id,坐席 id,我们会将这些固定参数放在 header 中,这时我们就可以使用过滤器来拦截请求,然后将取到的参数可以放到 request 或者 session 作用域中,在 controller 中我们就可以使用 @RequestAttribute 或者 @SessionAttribute 注解来获取值