我在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>"
如果有人可以调查并帮助我,我将不胜感激
答案 0 :(得分:13)
这将有效:
@RequestMapping(value = "/{authorizationUrl}", method = DELETE)
public @ResponseBody 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。你的方法实际上被调用了;之后发生了错误代码。
答案 1 :(得分:2)
您的注释应如下所示:
@RequestMapping(value = "/{authorizationUrl}",method=RequestMethod.DELETE)
我不知道你从哪里得到DELETE变量。 : - )
答案 2 :(得分:1)
如果@RequestMapping
模式不匹配或无效,则会导致找不到404。但是,如果碰巧使用不同的方法匹配另一个映射(例如GET),则会生成此405 Http method DELETE is not supported
。
我的问题就像这个,除了我的requestMapping是原因。就是这样:
@RequestMapping(value = { "/thing/{id:\\d+" }, method = { RequestMethod.DELETE })
你看到了吗?缺少内部右大括号,它应该是:{ "/thing/{id:\\d+}" }
\\d+
是一个匹配1个或多个数字的正则表达式。大括号用于分隔路径中的参数,以便与@PathVariable
一起使用。
由于它无效,因此无法与我的DELETE请求匹配:\ n http://example.com/thing/33 这会导致404找不到错误,但是,我有另一个GET映射:
@RequestMapping(value = { "/thing/{id:\\d+}" }, method = { RequestMethod.GET })
由于大括号模式是正确的,但它不是DELETE方法,因此它不支持错误405方法。
希望这能帮到你!
答案 3 :(得分:0)
还要确保您使用"Content-Type" header="text/html"
进行调用。如果没有,则更改它或在requestMapping
中指定它。如果它不匹配,你得到相同的405.
希望这有助于某人。
答案 4 :(得分:0)
我需要返回ResponseEntity<Void>
(具有自定义响应状态),而不是在HttpServletResponse
上设置自定义响应状态(来自端点方法参数)。
例如:http://shengwangi.blogspot.com/2016/02/response-for-get-post-put-delete-in-rest.html