7

我正在尝试找到要返回的正确状态代码,这是我目前所想到的:

  1. GET /api/documents/1- 文档存在,用户有权访问 - 200 OK
  2. GET /api/documents/2- 文档存在,用户无权访问 - 403 Forbidden
  3. GET /api/documents/3- 文档不存在(无法检查是否有访问权限) - 404 Not Found?403禁止?
  4. GET /api/documents/a- id 无效(应该是数字) - 400 Bad Request?404 未找到?403禁止?

目前我的后端(使用 MongoDB)的问题是,我要做的第一件事是检查用户是否有权访问文档,方法是对照他有权访问的文档 ID 列表检查该文档。如果在列表中没有找到document_id,则自动返回403 Forbidden。这有助于我避免首先从数据库中获取文档以查看用户是否可以访问它。

我不确定这里的最佳做法是什么——我应该追求更好的 HTTP 状态代码(从而创建额外的数据库请求)还是 403 Forbidden 也适用于最后两种情况(3 和 4)?

4

2 回答 2

11

我建议#3 和 #4 都使用404

1. GET /api/documents/1 - 文档存在,用户有权访问 - 200 OK

200是合适的。

2. GET /api/documents/2 - 文档存在,用户无权访问 - 403 Forbidden

403是合适的。

3. GET /api/documents/3 - 文档不存在(无法检查是否有访问权限) - 404 Not Found?403禁止?

404在这里是合适的,因为文档在指定的 URI 中不存在。

4. GET /api/documents/a - id 无效(应该是数字) - 400 Bad Request?404 未找到?403禁止?

404在这里仍然适用,因为在指定的 URI 上不存在资源。作为参考, 400的是格式错误的语法,但 URI 和请求在语法上是完全有效的;只是您的服务器上没有相应的资源可用。

一般来说,您应该首先考虑 API 并遵循标准 HTTP 方法。这是否需要另一个内部数据库请求是一个实现细节。我建议避免过早的优化,尤其是那些会对您的客户产生如此直接影响的优化。

于 2013-01-15T23:11:26.857 回答
1

我会说使用用于场景 #3 的 HTTP 代码,使用 404(因为找不到资源,但如果找到的话,用户将拥有访问权限),对于场景 #4 使用 400(因为它确实是一个错误的请求)。

这口井可以帮助您的实施客户了解到底出了什么问题。特别是对于 404,它在许多系统中会在正常操作中出现(即查询登录凭据或类似的东西),客户端可能需要了解他们的请求未满足的确切原因。

我看不到返回正确的状态代码会如何导致更多的数据库请求。您仍然可以为合法的 403 用例返回 403。

于 2013-01-15T21:40:21.770 回答