Spring - 该URL不支持405 Http DELETE方法

23

我在Spring中执行“DELETE” HTTP请求时遇到了奇怪的问题。

我有一个控制器方法,将一个DELETE请求映射到其中:

    @RequestMapping(value = "/{authorizationUrl}",method=DELETE)
    public void deleteAuthorizationServer(
            @RequestHeader(value="Authorization") String authorization,
            @PathVariable("authorizationUrl") String authorizationUrl)
            throws  IOException {

        System.out.println("TEST");

    }
控制器使用 @RequestMapping("/authorization_servers"); 进行映射。 当我通过 DEV Http 客户端发送请求时,我收到响应:405 Http method DELETE is not supported by this URL。 请求如下:
 DELETE    localhost:8080/authorization_servers/asxas

  Headers:
  Authorization: "test:<stuff>"

如果有人能够查看此事并帮助我,我将不胜感激。


控制器类本身有什么映射?您是否也设置了@ApplicationPath? - jgitter
谢谢!我有这个@RequestMapping("/authorization_servers") - Sasanka Panguluri
根据建议,将此内容移至评论中。该方法是由Ajax调用的,对吗? - geoand
显示更多日志,错误信息 - NimChimpsky
1
你用什么URL来访问它?很抱歉我要问这样显而易见的问题,但当我们弄清楚时,我感觉会是一个/facepalm时刻。 - jgitter
显示剩余18条评论
5个回答

19

这将会起作用:

@RequestMapping(value = "/{authorizationUrl}", method = DELETE)
@ResponseBody
public void deleteAuthorizationServer(
    @RequestHeader(value="Authorization") String authorization,
    @PathVariable("authorizationUrl") String authorizationUrl
){
    System.out.printf("Testing: You tried to delete %s using %s\n", authorizationUrl, authorization);
}
你缺少了@ResponseBody。实际上,你的方法已经被调用了;问题出在方法调用之后所发生的事情导致了错误代码。

咕噜 真不敢相信我错过了那个。 - jgitter
6
这真的不应该返回 405 错误。如果出现这种情况,那么这是 Spring 的一个 bug。 - Sotirios Delimanolis
这对我不起作用 :/http://stackoverflow.com/questions/11471604/getting-405-request-method-get-not-supported-when-calling-method-delete - mfaisalhyder

5
如果@RequestMapping模式不匹配或无效,则会导致404未找到错误。但是,如果它恰好与具有不同方法(例如GET)的另一个映射相匹配,则会导致405 Http方法DELETE不受支持
我的问题与此类似,只是我的requestMapping是原因。它是这样的:
@RequestMapping(value = { "/thing/{id:\\d+" }, method = { RequestMethod.DELETE })

你看到了吗?内部的闭合括号丢失了,应该是:{ "/thing/{id:\\d+}" } \\d+ 是一个正则表达式,用于匹配一个或多个数字。花括号用于分隔路径中的参数,以便与@PathVariable一起使用。
由于它是无效的,它无法匹配我的DELETE请求:http://example.com/thing/33,这将导致404未找到错误。但是,我有另一个用于GET的映射:
@RequestMapping(value = { "/thing/{id:\\d+}" }, method = { RequestMethod.GET })

由于大括号模式是正确的,但它不是DELETE方法,所以会出现错误405方法不支持。


1
这很有帮助,谢谢。无论谁看到这个,检查一下你的括号!! - hamza saber
还要检查我的映射,就像我有两个控制器的映射一样,如/contacts/{id} DELETE和"/contacts GET",所以当我使用空的url调用我的DELETE端点时,{id} pathVariable与我的/contacts/ GET端点匹配,导致405。 - Jay Yadav

4
您的注释应该像这样:

您的注释应该长成这样:

@RequestMapping(value = "/{authorizationUrl}",method=RequestMethod.DELETE)

我不知道你从哪里得到了DELETE变量。 :-)

4
可能OP使用了静态导入来处理DELETE请求。如果没有使用,那么你发现的很好! - geoand
谢谢您的时间,不过我已经从Spring中静态导入了DELETE: import static org.springframework.web.bind.annotation.RequestMethod.DELETE; - Sasanka Panguluri
糟糕!得重新开始考虑了。 - jgitter

1

0

同时确保你使用 "Content-Type" header="text/html" 调用它。如果没有,那么请更改或在 requestMapping 中指定它。如果不匹配,你会得到相同的 405 错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接