当我的数据库中找不到数据时,我应该响应什么状态代码

时间:2015-03-28 13:01:22

标签: rest restful-url

我想知道我在下面代码的else语句中会回复什么状态代码:

       if (album) {
            res.status(200).json({error: false, data: {channel_id: album.attributes.channel_id, id: album.id}});
        } else {
            res.status(200).json({error: false, data: {message: 'There is not album found with this name'}});
        }

我不想留下他们两个200,因为我想从前端管理消息通过状态代码,例如,如果它返回200我会说“成功创建”,而在其他情况下我会显示“没有数据找到”。

你的建议是什么?

2 个答案:

答案 0 :(得分:1)

"未找到数据"应该是404。

"成功创建"应该是201。

对于201,您还应该为另一个请求可以访问新资源的位置指定Location标头。

参考文献:
201 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.2
404 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5

更新:

我认为我会对此进行扩展,因为下面的评论指出了我与自己斗争的思维过程。

GET /some/thing响应404 Not Found可能意味着找不到数据库实体,但也可能意味着没有此类API端点。 HTTP本身并没有帮助区分这些案例。该网址代表资源。与它所代表的东西不同,它本身并不是一件事。

某些API在向不存在的端点发出请求时会响应400,但我个人并不喜欢这样,因为它似乎与Web服务器响应正常资源请求的方式相矛盾。它也可能会混淆构建客户端应用程序的开发人员,因为它表明HTTP传输中的某些内容是错误的,而不是在他们自己的代码中。

假设您决定将404用于丢失的数据库实体,并将400用于您认为错误的请求。这可能对您有用,但随着您的应用程序的增长,您将发现越来越多的简单状态代码无法自行通信的方案。这是我的观点..

我的建议是所有 API响应都会在正文中包含有意义的数据。 (JSON或XML,或者您正在使用的任何内容)。对无效网址的请求可能如下所示:

HTTP/1.1 404 Not Found

{ "error": "no_endpoint", "errorText":"No such API end point" }

答案 1 :(得分:0)

虽然,我同意上面的帖子,但我也会考虑某些情况下的HTTP状态200。

例如,您有Post和Post_Comments实体。当您为Post Id请求注释时,您可以拥有404(您需要在REST API使用者端处理的错误)或200,这意味着一切正常并返回空数组。在HTTP状态200的情况下,您不需要处理错误。作为示例,请查看FB如何处理HTTP代码https://apigee.com/about/blog/technology/restful-api-design-what-about-errors