关于@RequestBody
在Spring MVC框架中,在处理请求的方法的参数前:
-
当添加了
@RequestBody
注解,则客户端提交的请求参数必须是对象格式的,例如:{ "name": "小米11的相册", "description": "小米11的相册的简介", "sort": 88 }
如果客户端提交的数据不是对象,而是FormData格式的,在接收到请求时将报错:
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
-
当没有添加
@RequestBody
注解,则客户端提交的请求参数必须是FormData格式的,例如:name=小米11的相册&description=小米11的相册的简介&sort=88
如果客户端提交的数据不是FormData格式的,而是对象,则无法接收到参数(不会报错,控制器中各参数值为
null
)
另外,Knife4j框架的调试界面中,如果是对象格式的参数(使用了@RequestBody
),将不会显示各请求参数的输入框,而是提供一个JSON字符串供编辑,如果是FormData格式的参数(没有使用@RequestBody
),则会显示各请求参数对应的输入框。
通常,更建议使用FormData格式的请求参数!则在控制器处理请求的方法的参数上不需要添加@RequestBody
注解!
在Vue脚手架项目中,为了更便捷的使用FormData格式的请求参数,可以在项目中使用qs
框架,此框架的工具可以轻松的将JavaScript对象转换成FormData格式!
则在前端的Vue脚手架项目中,先安装qs
:
npm i qs -S
然后,在main.js
中添加配置:
import qs from 'qs';
Vue.prototype.qs = qs;
最后,在提交请求之前,可以将对象转换成FormData格式,例如:
let formData = this.qs.stringify(this.ruleForm);
console.log('formData:' + formData);