REST API用户尝试访问对象时使用哪个HTTP状态代码并出现错误?

时间:2013-01-15 21:38:08

标签: http mongodb rest http-status-codes

我正在尝试找回正确的状态代码,这是我到目前为止的想法:

  1. GET /api/documents/1 - 文档存在,用户有权访问 - 200 OK
  2. GET /api/documents/2 - 文档存在,用户无权访问 - 403 Forbidden
  3. GET /api/documents/3 - 文档不存在(无法检查是否有访问权限) - 404 Not Found? 403 Forbidden?
  4. GET /api/documents/a - id无效(应为数字) - 400错误请求? 404找不到? 403 Forbidden?
  5. 我的后端(使用MongoDB)目前的问题是,我要做的第一件事就是检查用户是否可以访问文档,方法是根据他有权访问的文档ID列表进行检查。 如果在列表中找不到document_id,则会自动返回403 Forbidden。这有助于我避免首先从数据库中获取文档,以查看用户是否可以访问它。

    我不确定这里最好的做法是什么 - 我应该追求更好的HTTP状态代码(从而创建额外的数据库请求),还是最后2个案例(3和4)的403 Forbidden工作?

2 个答案:

答案 0 :(得分: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方法。这是否需要另一个内部数据库请求是一个实现细节。我建议避免过早优化,特别是那些会对您的客户产生直接影响的优化。

答案 1 :(得分:1)

我会说使用HTTP代码按照预期的方案#3,使用404(因为找不到资源,但用户本来就有访问权限),因为方案#4使用400(因为它确实如此)一个糟糕的要求)。

帮助您的实施客户了解究竟出了什么问题。特别是对于404,在许多系统中会出现正常操作(即查询登录凭证或类似内容),客户可能需要了解其请求未得到满足的确切原因。

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