使用HEAD请求是否RESTful显示受保护资源的存在?

时间:2013-03-26 17:30:36

标签: http rest architecture

我有一个RESTful资源,其表示只能由经过身份验证的客户端检索。如果未经身份验证的客户端发出GET请求,将返回401。

另一方面,我希望未经身份验证的客户端能够确定资源是否存在。在这种情况下,我正在考虑如果资源确实存在,则HEAD请求返回200,否则返回404。

RFC 2616在第9.4节中说明了关于HEAD请求的以下内容

  

响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同。

这种方法是否会被认为是适当的RESTful?

作为替代方案,我可以让GET和HEAD请求为不存在的资源返回404,如果请求存在但是客户端没有权限则返回401.

2 个答案:

答案 0 :(得分:3)

我会去404/401路线。它更简单,更正交。还因为HEAD定义的第一行是:

  

HEAD方法与GET相同,只是服务器不能在响应中返回消息体。

这将为不支持HEAD的HTTP客户端留下空间。未经验证的他们可以简单地执行GET来确定资源的存在。不需要HEAD支持。

答案 1 :(得分:3)

如果您真的要允许未经身份验证的客户端确定资源的存在,我会选择后一个选项(404表示不存在,401表示未经身份验证)。如果暴露了该存在信息,则404/401是正确的响应:

  • 404:我正在向您证实,未经身份验证的客户,此资源不存在。
  • 401:我拒绝了您的请求,因为您没有获得此资源的适当授权。

另外,如果经过身份验证的客户端具有适当的访问权限并且存在,则允许经过身份验证的客户端为200的资源进行HEAD。