Spring Boot 返回 405 而不是 404 用于 POST 到未知 URL
Posted
技术标签:
【中文标题】Spring Boot 返回 405 而不是 404 用于 POST 到未知 URL【英文标题】:Spring Boot Returning 405 instead of 404 for POST to unknown URL 【发布时间】:2015-05-07 13:51:45 【问题描述】:免责声明:我是 Java、Spring 和 Spring Boot 的新手。
我想让 Spring Boot 在尝试 POST 到不存在的 URL 时返回 404。但是,现在它返回一个 405,带有一个只包含 GET 和 HEAD 的 Allow 标头。有没有办法自定义允许哪些 HTTP 方法以便我得到 404?我已经尝试实现自定义 ErrorController,但这似乎不起作用。
要明确:这是当我发布到一个不应与我定义的端点任何匹配的 URL 时,例如 http://example.com/some-bogus-thing p>
如果需要更多信息来诊断此问题,我很乐意提供。由于我对平台不熟悉,我不确定什么是相关的。
【问题讨论】:
你需要用@RequestMapping注解你的方法,并将method属性设置为想要的类型。 创建一个MCVE 并发布代码。我可以重现这种确切的行为,但我无法解释它,这就是为什么评论而没有答案。 我也看到了这一点,提问者是正确的。查看源代码,似乎只有对无效 URL 的 GET 请求才返回 404。对于所有其他请求,无论出于何种原因,框架默认返回 405。 【参考方案1】:HTTP 405 (Method not found)
被返回,when URL exists
并且您尝试使用该特定 URL 映射上不允许的 HTTP 方法。
如果您在.../test
下方调用 POST,那么它将返回 HTTP 405,反之亦然。
@RequestMapping(value = "/test", method = RequestMethod.GET)
如果没有任何 HTTP 方法的 URL 映射,那么它将返回 HTTP 404。
要了解该特定启动实例上的所有当前映射,只需转到浏览器
http://localhost:8080/mappings
【讨论】:
是的,您描述的情况是我想要返回 405。但是,我的情况是当我发布到一个 不 的 URL存在。我希望它是 404,但 Spring Boot 返回的是 405。 这是不可能的。如果没有 URL 映射,则返回 404。如果返回 405,则表示有映射。使用来自localhost:8080/mappings
的映射进行交叉检查。
当我转到 localhost:8080/mappings 时,我在顶部看到一个带有粉红色错误消息的页面,上面写着:This page contains the following errors: error on line 1 at column 25: expected '>' Below is a rendering of the page up to the first error.
这是要渲染的模板是什么?我可以纠正它,但我不知道在哪里看。
k139 是正确的。如果没有可用的 URL 映射,它将返回 404。如果您尝试使用错误的 HTTP 方法来调用控制器方法,则会得到 405。此外,您需要共享相关代码,以便人们可以帮助您。它在黑暗中拍摄。
我也看到了这一点,提问者是正确的。查看源代码,似乎只有对无效 URL 的 GET 请求才返回 404。对于所有其他请求,无论出于何种原因,框架默认返回 405。【参考方案2】:
检查这里: https://github.com/spring-projects/spring-boot/issues/4876
解决方案是进行如下设置: 春天: MVC: 静态路径模式:/static/**
【讨论】:
这对我来说是一个很好的线索。可能有一些通用处理程序混淆了这个问题。就我而言,它与自定义ErrorController
有关。 405 响应包括 Allow: GET
,但执行 GET
会返回 404。link 表明已修复此问题,但看起来还没有。【参考方案3】:
如果有人仍然遇到此问题: 这是spring framework 4.2.4的一个bug,请参考https://github.com/spring-projects/spring-framework/issues/18516 正如它所说,自 4.3 RC1 以来,此问题已得到修复。
【讨论】:
以上是关于Spring Boot 返回 405 而不是 404 用于 POST 到未知 URL的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 2 Actuator 端点在 GET 请求上返回 405
为啥 Spring Boot Actuator 返回 404 而不是 401?