@RequestBody和@RequestParam区别

@RequestBody与@RequestParam

@RequestBody主要用来接收客户端请求传递给后台接口的json字符串中的数据(请求体中的数据);
GET方式的请求没有请求体,所以使用@RequestBody接收数据时,客户端不能使用GET方式提交数据,需要用POST方式提交。
在同一个后台接口里,@RequestBody@RequestParam可以同时使用,且@RequestBody最多 只能有一个 ,而@RequestParam 可以有多个 (一个注解对应一个参数)。

注意:

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

如果后台接口接收参数是一个对象,以@RequestBody修饰的,那么前端传递json数据时,必须满足以下要求:

  1. 后端@RequestBody注解对应的类(对象)在将HTTP的输入流(含请求体)装配到参数对象时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为)实体类对应属性的类型要求时,会通过调用实体类的setter方法的方式赋值给对应属性。
    如:json字符串中,如果value为"“的话,后端对应属性如果是String类型的,那么接受到的就是”",如果是后端属性的类型是IntegerDouble等类型,那么接收到的就是null。如果valuenull的话,后端对应收到的就是null
  2. 如果某个参数没有value的话,在传json字符串给后端时,要么干脆就不把该字段写到json字符串中;要么 必须有值,null 或""都行。千万不能有类似"stature":,这样的写法,如:
    @RequestBody和@RequestParam区别_第1张图片

————————————————
版权声明:本文基于CSDN博主「justry_deng」的原创文章修改,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/justry_deng/article/details/80972817/

你可能感兴趣的:(spring,boot,json,java,RequestBody,RequestParam)