当REST应用程序收到一个请求不存在的资源时,它是否应该始终返回404 Not Found
?
对于任何HTTP方法(GET
、HEAD
、POST
、PUT
、DELETE
、OPTIONS
或TRACE
),它应该返回不同的状态吗?
Spring对于GET
和HEAD
返回404
,对于OPTIONS
返回200 OK
,对于其他方法返回405 Method Not Supported
。这样做是否正确?
例如,这个Spring Boot应用程序显示了对于错误的URL请求(greetings而不是greeting)的不同响应。
@RestController
@SpringBootApplication
public class Application {
private static Logger log = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
RestTemplate restTemplate = new RestTemplate();
String badUrl = "http://localhost:8080/greetings";
for (HttpMethod httpMethod : HttpMethod.values()) {
try {
restTemplate.execute(badUrl, httpMethod, null, null);
} catch (Exception e) {
log.error("Failed to " + httpMethod + " -- " + e.getMessage());
}
}
}
@RequestMapping("/greeting")
public String greeting() {
return "hello";
}
}
记录的输出是:
无法获取 -- 404 找不到
无法 HEAD -- 404 找不到
无法 POST -- 405 方法不允许
无法 PUT -- 405 方法不允许
无法 PATCH -- 在“http://localhost:8080/greetings”上进行 PATCH 请求时出现 I/O 错误:无效的 HTTP 方法:PATCH;嵌套异常为 java.net.ProtocolException: Invalid HTTP method: PATCH
无法删除 -- 405 方法不允许
对“http://localhost:8080/greetings”的 OPTIONS 请求结果为 200 (OK)
无法 TRACE -- 405 方法不允许