PUT、DELETE非简单请求相关问题及解决方法

21 篇文章 0 订阅

PUT、DELETE非简单请求相关问题及解决方法

首先要说一下什么是简单请求和非简单请求。
简单请求:简单请求为GET和POST,当客户端给服务器发送者两种请求时,服务器可以直接处理。
非简单请求:非简单请求指的是PUT、DELETE以及其他扩展标准请求,当客户端给服务器发送者两种请求时,会先发送一次预检请求,确认服务器是否能处理这种请求,然后再决定是否要发送该次请求,预检请求可以减轻服务器的压力。

对于PUT请求,要想对其支持,有几种办法:

  1. Tomcat默认是不支持PUT、DELETE请求的,我们可以在Tomcat的web.xml文件中,找到<servlet>标签,在其内添加如下代码(但是不推荐使用这种方法):
 <init-param>
     <param-name>readonly</param-name>
     <param-value>false</param-value>
 </init-param>
 
  1. SpringMVC早期只支持GET和POST请求,对于PUT、DELETE这种特殊请求是不支持的,但是随着技术的演进,这些请求也是SpringMVC必须要考虑的,SpringMVC并没有把PUT、DELETE请求的处理方式强塞到原有代码上,因此SpringMVC做了一个折中的方案,作为PUT、DELETE请求,SpringMVC提供了一个额外的表单内容过滤器来对PUT、DELETE进行额外处理。所以如果遇到PUT或DELETE请求无法接收到表单数据的时候,可以打开web.xml,添加如下代码:
<filter>
    <filter-name>formContentFilter</filter-name>
    <filter-class>org.springframework.web.filter.FormContentFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>formContentFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

FormContentFilter实际上是对SpringMVC能力的扩展

  1. SpringBoot中,修改配置文件,添加配置spring.mvc.hiddenmethod.filter.enabled=true
    虽然通过配置此时已经能使用PUT、DELETE请求了,但是还有一些问题存在,此时的PUT请求无法接收到参数,对于此,我们要写一个WebConfig类继承WebMvcConfigurationSupport,增加一个bean formContentFilter(与SpringMVC中的formContentFilter一样),来使得PUT可以接收参数,代码如下:
public class WebConfig extends WebMvcConfigurationSupport {
        @Bean
        public FormContentFilter formContentFilter() {
            return new FormContentFilter();
        }
}

即便此时PUT请求能接收到参数了,但是在接收参数方面是有问题存在的。
首先是请求的contentType不是application/json的情况下,这个时候后端接收参数和对象,对象无须加@RequestBody注解,参数需加@RequestParam注解。
然后就是请求的contentType是application/json的情况下,这时候对象要用@RequestBody注解,参数只能用@PathVariable注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackieLeeee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值