基础知识
@RequestBody注解用于接收前端传递给后端的请求体中的json字符串中的数据,因为读取的是请求体当中的数据,所以需要通过POST请求进行数据提交。
@RequestParam注解用来处理请求头Content-Type: 为 application/x-www-form-urlencoded编码的内容。get 方式中queryString的值,和post方式中 body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中进行获取。
一个请求当中@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
@RequestBody
- 注解@RequestBody一般用于接收requestBody即请求体当中的参数,在后端注解对应的类在将HTTP的输入流(含请求体)装配到目标类时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为) 实体类的对应属性的类型要求时,会调用实体类的setter方法将值赋给该属性。
- son字符串中,如果value为"“的话,后端对应属性如果是String类型的,那么接受到的就是”",如果是后端属性的类型是Integer、Double等类型,那么接收到的就是null。
- json字符串中,如果value为null的话,后端对应收到的就是null。
@RequestParam
RequestParam可以接受简单类型的属性,也可以接受对象类型。
@RequestParam当中有三个配置参数:
- required 表示是否必须,默认为 true,必须。
- defaultValue 可设置请求参数的默认值。
- value 为接收url的参数名(相当于key值)。
注解@RequestParam一般用于接收requestParam即请求头当中的参数,在后端注解参数如果是基础数据类型,且require为false时不传参数会发生错误,原因是,required=false时,不传参数的话,会给参数赋值null。
总结
- 从content-type方面来讲:form-data、x-www-form-urlencoded:不可以用@RequestBody,可以用@RequestParam;application/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam。
- 从注解方面来讲:当同时使用@RequestParam和@RequestBody时,@RequestParam指定的参数可以是普通元素、数组、集合、对象等等(即:当@RequestBody 与@RequestParam()可以同时使用时,原SpringMVC接收参数的机制不变,只不过RequestBody 接收的是请求体里面的数据;而RequestParam接收的是key-value里面的参数,所以它会被切面进行处理从而可以用普通元素、数组、集合、对象等接收)。即:如果参数时放在请求体中,传入后台的话,那么后台要用@RequestBody才能接收到;如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用@RequestParam来接收,或则形参前什么也不写也能接收。