接收PUT、PATCH、DELETE方法的form data参数

问题描述:

场景:

在将原有的系统改造为springboot项目时,打算将原有的get、post请求改为get、post、put、delete请求,使用了mybatis-plus的自动生成基础代码。

问题:

但是,在使用@PutMapping时,后端接收不到传递过来的参数。

 

查找解决方案:

1. HttpPutFormContentFilter

在网上搜索之后发现,有一个 HttpPutFormContentFilter 类,可以解决这个问题。类注释中有这么一段话:

The Servlet spec requires form data to be available for HTTP POST but not for HTTP PUT or PATCH requests. This filter intercepts HTTP PUT and PATCH requests where content type is {@code 'application/x-www-form-urlencoded'}, reads form encoded content from the body of the request, and wraps the ServletRequest in order to make the form data available as request parameters just like it is for HTTP POST requests.

翻译如下(凑合着看吧):

Servlet规范要求POST请求的from data必须是可用的,但并没有要求PUT、PATCH也如此。这个过滤器拦截那些内容类型是'application/x-www-form-urlencoded'(译者注:对应发送的数据就是form data)的PUT和PATCH请求,并读取请求体中加密的内容,最后将form data封装到ServletRequest,从而像POST请求一样,从request的parameter中就可以有效的获取到from data的各个参数。

2. FormContentFilter类

由于该类是废弃类,所以源码中推荐了另外一个类,FormContentFilter,这个类的注释:

Filter that parses form data for HTTP PUT, PATCH, and DELETE requests and exposes it as Servlet request parameters. By default the Servlet spec only requires this for HTTP POST.

翻译如下:

将HTTP的PUT、PATCH、DELETE请求中的form data转化,并暴露给Servlet的“请求参数”。默认情况下,Servlet规范仅仅要求POST请求转化form data。

注意:

FormContentFilter类和HttpPutFormContentFilter类的区别,前者比后者多处理了DELETE请求。

 

结论:

从注释中,就很好懂了,默认情况下,Servlet规范是不支持PUT、PATCH、DELETE的,只支持POST,因此,在springboot的启动类或者任意的配置类上导入FormContentFilter即可。如果不需要处理DELETE请求,HttpPutFormContentFilter也可以,但是已废弃。

解决方法:

@SpringBootApplication
@Import( FormContentFilter.class )
public class SpringApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringApplication.class, args);
	}
}

或者:

@Configuration
@Import( FormContentFilter.class )
public class FormContentConfig {
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章