获取“405 - 调用时不支持请求方法'GET'”方法=删除
Posted
技术标签:
【中文标题】获取“405 - 调用时不支持请求方法\'GET\'”方法=删除【英文标题】:Getting "405 - Request method 'GET' not supported when calling" method=DELETE获取“405 - 调用时不支持请求方法'GET'”方法=删除 【发布时间】:2012-07-13 08:53:08 【问题描述】:我有一个 Spring MVC Web 应用程序。其中有一个带有按钮的表单,该按钮应该从另一个资源中删除一个资源:
<td>
<form action="/product-bases/$productBase.id/positions/$position.id" method="DELETE">
<input type="submit" value="delete" />
</form>
</td>
我的控制器:
@Controller
@RequestMapping(value = "/product-bases/id/positions")
public class ProductBasePositionController
@RequestMapping(value = "/positionId", method = RequestMethod.DELETE)
public ModelAndView delete(@PathVariable Integer productBaseId, @PathVariable Integer positionId)
所以理论上服务器应该路由到控制器。但可惜它没有,因此帖子;)
我来了
HTTP Status 405 - Request method 'GET' not supported
type Status report
message Request method 'GET' not supported
description The specified HTTP method is not allowed for the requested resource (Request method 'GET' not supported).
Apache Tomcat/7.0.19
显然我还没有定义 /positions/id 的 get,但我为什么要这样做,我现在想删除..
(我也试图从我的 spring-test-mvc 框架在一个模拟 servlet 上运行它,中间没有任何 tomcat 实现,它给了我一个 400 - 错误的请求.. )
那么我在这里错过了什么?
哦,只是为了偷工减料:post 和 get 将适用于其他资源,所以我的其余设置都很好。
启动服务器甚至告诉我:
RequestMappingHandlerMapping [INFO] Mapped "[/product-bases/id/positions/positionId],methods=[DELETE],params=[],headers=[],consumes=[],produces=[],custom=[]" onto public org.springframework.web.servlet.ModelAndView our.view.controller.ProductBasePositionController.delete(java.lang.Integer,java.lang.Integer)
有人和我一样困惑吗?如果不是这样,请赐教!
【问题讨论】:
【参考方案1】:表单只能通过GET
或POST
提交(也可能是PUT
,但我怀疑这是否被广泛实施),因为表单提交需要一种将数据传输到服务器的方法。
DELETE
方法没有请求正文,因此不支持在表单操作中指定它。
【讨论】:
差不多。浏览器目前仅支持 GET 和 POST,因此在不支持时将方法静默更改为 GET。 哇,我不知道。所以我唯一的选择似乎是在名称=方法值=删除的表单中放置一个隐藏的输入字段?除了 javascrip 我的意思是.. 因为我也不能通过链接发送删除.. 似乎有点奇怪,并且使任何开发真正 RESTful 的尝试变得不可能?! 皮特:见w3.org/html/wg/tracker/issues/195。您可能想加入 HTML WG。详情请见w3.org/html/wg。【参考方案2】:您的 web.xml 中有 HiddenHttpMethodFilter 过滤器吗?
<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>
http://static.springsource.org/spring/docs/current/spring-framework-reference/html/view.html#rest-method-conversion
【讨论】:
啊,这听起来也很有希望,周一试试。。谢谢! 不幸的是,我们不能使用过滤器技巧,因为我们使用不支持过滤器的 spring-test-mvc 将不再可测试。【参考方案3】:错误消息表明浏览器实际上发送的是 GET 请求而不是 DELETE 请求。
你需要做的是:
检查浏览器当时所在网页的来源,并
使用浏览器的网络调试器,查看请求的 URL 和方法究竟是什么。
【讨论】:
【参考方案4】:在 Microsoft Azure 门户中,当我打开身份验证/授权时,Java 应用程序出现此错误。如果您遇到同样的问题,请恢复您的操作。
【讨论】:
以上是关于获取“405 - 调用时不支持请求方法'GET'”方法=删除的主要内容,如果未能解决你的问题,请参考以下文章