【总结】解决MVC无法处理Restful风格PUT/DELETE方法参数接收的问题

针对三种常用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就没有问题了 , 缺点是好像不支持多个参数 (你必须把这些参数封装到对象里)

猜你喜欢

转载自blog.csdn.net/u012309392/article/details/84839093