2016-02-14 22 views
1

当一个REST应用程序收到一个不存在资源的请求时,它是否总是返回404 Not Found针对不同的http方法返回对无效URL的请求的状态?

如果它返回一个不同的状态对于任何HTTP methodsGETHEADPOSTPUTDELETEOPTIONSTRACE

春天返回GETHEAD一个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不允许的方法

回答

1

简短的回答:它不会总是返回404。较长的回答:规范似乎提供了一些关于使用哪些状态码的选项。在https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5规范说:


10.4.5 404未找到

服务器没有找到任何匹配的请求URI。没有迹象表明病情是暂时的还是永久性的。如果服务器通过某种内部可配置机制知道旧资源永久不可用并且没有转发地址,则应使用410(Gone)状态码。当服务器不希望揭示请求被拒绝的原因时,或者没有其他响应适用时,通常使用此状态码。

10.4。6 405不允许的方法

在Request-Line中指定的方法不允许由Request-URI所标识的资源。响应必须包含一个Allow头,其中包含请求资源的有效方法列表。


有一些解释的余地​​时,使用这两个代码。我的解释是:如果某些资源不存在,但一些可以想象的操作仍然可以应用到URI,那么405会更合适。

例如:

GET /reservation/1 

405 Method not allowed 
Allow: PUT 

可能意味着,尽管GET不允许在那个特定的资源(因为它实际上并不存在的),你仍然可以使PUT工作,从而创建所述资源的过程中。

可以说,一个404,虽然允许通过本说明书中,将不太使​​用。

关于OPTIONS。规格在这里:https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.2。根据规范不暗示与资源本身的相互作用。这更多的是对服务器的查询,以确定在给定的URI上“理论上”支持哪些方法。它支持例如通配符(“*”)查询,该查询也可能根本不存在。

+0

是的,我明白你的意思GET(等)与放什么。因此,举例来说,/ questionId/answerId可能不存在,所以我们不能GET,但只要so/questionId存在,我们可以PUT - 所以405是合适的。如果问题不存在,那么既不能GET也不要PUT答案 - 所以404是合适的。 –

+0

是的,确切地说。但是,在我阅读上面的错误代码时,还有一些解释空间,在特定情况下确实或没有意义。我不认为大多数服务器或客户准备做出这样的区分。在大多数情况下,它甚至可能没有什么区别。 –

相关问题