接收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 {
}

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值