@RequestBody与@RequestParam
@RequestBody
主要用来接收客户端请求传递给后台接口的json
字符串中的数据(请求体中的数据);
GET
方式的请求没有请求体,所以使用@RequestBody
接收数据时,客户端不能使用GET
方式提交数据,需要用POST
方式提交。
在同一个后台接口里,@RequestBody
与@RequestParam
可以同时使用,且@RequestBody
最多 只能有一个 ,而@RequestParam
可以有多个 (一个注解对应一个参数)。
注意:
- 当同时使用
@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的
。
如果后台接口接收参数是一个对象,以@RequestBody
修饰的,那么前端传递json
数据时,必须满足以下要求:
- 后端
@RequestBody
注解对应的类(对象)在将HTTP
的输入流(含请求体)装配到参数对象时,会根据json
字符串中的key
来匹配对应实体类的属性,如果匹配一致且json
中的该key
对应的值符合(或可转换为)实体类对应属性的类型要求时,会通过调用实体类的setter
方法的方式赋值给对应属性。
如:json
字符串中,如果value
为"“的话,后端对应属性如果是String
类型的,那么接受到的就是”",如果是后端属性的类型是Integer
、Double
等类型,那么接收到的就是null
。如果value
为null
的话,后端对应收到的就是null
。 - 如果某个参数没有
value
的话,在传json
字符串给后端时,要么干脆就不把该字段写到json
字符串中;要么 必须有值,null
或""都行。千万不能有类似"stature"
:,这样的写法,如:
————————————————
版权声明:本文基于CSDN博主「justry_deng」的原创文章修改,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/justry_deng/article/details/80972817/