4

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

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

RFC 2616 在第 9.4 节中对 HEAD 请求进行了如下说明

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

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

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

4

2 回答 2

3

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

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

这将为不支持 HEAD 的 HTTP 客户端敞开大门。未经身份验证的他们可以简单地执行 GET 来确定资源的存在。无需 HEAD 支持。

于 2013-03-26T18:26:31.617 回答
3

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

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

另外,如果经过身份验证的客户端具有适当的访问权限并且该资源存在,则这允许经过身份验证的客户端将资源用于 200。

于 2013-03-26T18:28:00.467 回答