踩坑(2) 关于Request method 'PUT' ('DELETE')not supported

踩坑(2) 关于Request method ‘PUT’ (’DELETE’)not supported

在RESTful风格中,我们会将原本的GET,POST方法通过HiddenHttpMethodFilter过滤器和<input type="hidden" name="_method" value="PUT或DELETE"/>隐藏域 转换为 对应的方法。

但实际上,实际写代码会总出错。出现如:
Request method 'PUT' not supportedRequest method 'DELETE' not supported。对于这种错误,现在进行如下总结:

一: 比对URI

GET,POST,PUT,DELETE, Spring都支持,不要怀疑Spring, 可能是前端发送的rest 请求和后端的响应不匹配,

比如,我在遇到一个Request method 'DELETE' not supported时,在点击删除时,传递的URI应该是xxx/emp/1005,也就是说后面是带id号的,在我认真检查之后,发现在Handler的方法中,在@RequestMapping 的映射中,我忘记写占位符了{id},导致uri:/emp没有匹配的前端的REST请求/emp/1005

@RequestMapping(value = "/emp/{id}",method = RequestMethod.DELETE)
    public String delete(@PathVariable("id") Integer id) {
        employeeDao.delete(id);
        return "redirect:/emps";
    }

二:没有使用绝对路径

如果你说我的占位符已经添加了,但是还是有问题,那怎么办?

比如我就遇到一个修改用的操作,结果出现Request method 'POST' not supported 我的占位符也写了,但是还是有问题。

 @RequestMapping(value = "/emp/{id}",method = RequestMethod.GET)
    public String input(@PathVariable("id") Integer id,Map<String,Object> map) {
        map.put("employee",employeeDao.get(id));
        map.put("departments",departmentDao.getDepartments());
        return "input";
    }

我们还是要检查:前端发送的rest 请求和后端的响应匹配否?

通过检查,发现我们原本的路径xxx/emp/001跳转变为xxx/emp/emp
这就是因为请求页面的form标签的action不是绝对路径。在实际开发中,我们都要写绝对路径:

<form:form action="${pageContext.request.contextPath}/emp" method="POST" modelAttribute="employee">

三 修改Tomcat的web.xml

如果上面的方法不好使,那是因为其根源在于Web服务器默认的只支持Post和Get这两种“只读”的请求方法,而不支持rest风格的put,delete等方法的。因此我们在 Tomcat目录下的conf目录下的web.xml文件中,进行修改:

servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
    //主要是这里,默认的readonly属性是true,即不支持put方法,改为false
        <param-name>readonly</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

若web.xml中已经存在readonly就修改value为false,若没有就新加。

如果对你有帮助,点赞;如果你发现的新的问题,请留言。谢谢!

  • 29
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值