当一个REST应用程序收到一个不存在资源的请求时,它是否总是返回404 Not Found
?针对不同的http方法返回对无效URL的请求的状态?
如果它返回一个不同的状态对于任何HTTP methodsGET
,HEAD
,POST
,PUT
,DELETE
,OPTIONS
或TRACE
?
春天返回GET
和HEAD
一个404
,为OPTIONS
一个200 OK
,并为他人405 Method Not Supported
。那是错的吗?
例如此Spring Boot应用程序显示对错误输入的URL的请求的不同响应(问候语而不是问候语)。
@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方法不允许
无法执行 - 405不允许执行方法
PATCH失败 - “http://localhost:8080/greetings”PATCH请求上的I/O错误:HTTP方法无效:PATCH;嵌套异常是java.net.ProtocolException:无效HTTP方法:PATCH
无法删除 - 405不允许的方法
OPTIONS请求 “http://localhost:8080/greetings” 导致200(OK)
无法TRACE - 405不允许的方法
是的,我明白你的意思GET(等)与放什么。因此,举例来说,/ questionId/answerId可能不存在,所以我们不能GET,但只要so/questionId存在,我们可以PUT - 所以405是合适的。如果问题不存在,那么既不能GET也不要PUT答案 - 所以404是合适的。 –
是的,确切地说。但是,在我阅读上面的错误代码时,还有一些解释空间,在特定情况下确实或没有意义。我不认为大多数服务器或客户准备做出这样的区分。在大多数情况下,它甚至可能没有什么区别。 –