针对三种常用Content_Type :
1.application/x-www-form-urlencoded 表单被编码为键值对。标准的编码格式 GET方式提交表单的默认编码
POST提交时 比如 报文原文为 key1=value1 提交后会进行编码 key1:value1 这种形式
拼接到报文Body中
注:因为GET请求没有Body , 不管是form-urlencodedhi是form-data GET会拼接到url显式传输
2.multipart/form-data 表单数据被编码为一条消息,每个控件对应消息中的一个部分
在报文Body发送前 是类似于先转换成
——————————————
xxx内容
——————————————
xxx内容
这样一段一段的东西,可以传输二进制数据 / 比如文件,也可以传输普通字符
3.application/json JSON格式数据
首先 MVC里接收参数默认是接收@RequestParam 中定义的x-www-form-urlencoded 格式的表单参数
form-data需要在web.xml中配置支持
form表单只支持GET与POST两种方式,而不支持DELETE、PUT,即使你使用了PUT提交了 他也会帮你转为GET ,后台会报 METHOD 不支持
但你用POSTMAN进行请求 使用PUT 的头部 ,还是接收不到参数 ,具体的原因就需要研究了
所以结论就是当你使用Restful风格的api时,
表单编码的参数,全部都无法接收
下面是实例:
我们去掉所有配置,来看一下restful对应PUT/DELETE参数接收情况
/**
* 修改密码
*/
@PutMapping(value = "password/{id}")
@ResponseBody
public ServerResponse updatePersonalPwd(@PathVariable(value = "id") String id, String oldPwd, String pwd) {
System.out.println(oldPwd+":"+pwd);
}
请求方式1 . PUT form-data
后台接收情况 : oldPwd:null pwd:null
请求方式2 . PUT x-www-form-urlencoded
后端接收情况 oldPwd: null pwd: null
尝试解决:在web.xml Dispatcher的servlet标签之前(必要的)加上一对spring的拦截器
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
原理是利用过滤器 ,将表单请求中的_method 参数 与 GET/POST/PUT/DELETE 等 与@RequestMapping(method = XXX)进行匹配。 但是过滤器只会拦截 POST方法 , 所以请求方式必须是POST enctype =x-www-form-urlencoded (必须) ,但是在表单添加 _method 属性
添加后直接说结论
1. form-data 请求异常 无法识别_method
2. x-www-form-urlencoded 请求成功 后台可以接收到参数
终极解决方案—使用application/json + @RequestBody 接收JSON数据
因为参数接收限制,仅限于表单类型 ,使用json就没有问题了 , 缺点是好像不支持多个参数 (你必须把这些参数封装到对象里)