HTTP 响应始终 return 响应代码 200 即使请求失败,并且 return 状态代码是 REST 的一部分

HTTP response always return response code 200 even request fail, and return status code is part of REST

我最近加入了一个新项目。在这个项目中,所有 API 服务总是 return 状态代码 200。即使,如果响应应该是 400 或 404,API return 状态代码 200 .

我问 API 不 return 其他响应代码的原因,程序员告诉我他们不使用响应代码。他们将信息放在 body 中。

例如,缺少一些必填字段,它们 return 响应状态代码 200,但是 body return 是这样的

{"result" : "fail"}

如果未经授权的用户试图访问,状态码为 200,body return 像这样

{"result" : "unautherized"}

我以前做的很不一样,我总是按情况指定状态码,并尝试return合适的状态码和消息。我认为这是 HTTP 协议的一部分。但是,他们告诉我指定状态代码,如 400、404、300,是 RESTful API 的一部分,并且 return 总是 200 是正确的状态代码,因为服务器响应并且它是活。 APIs,总是要 return 200 除了 500。因为当服务器挂掉时,它不能 return 任何东西。

所以这些就是问题。

  1. 服务器应该总是 return 状态码 200 除了服务器死机?
  2. 指定各种状态代码是 REST 的一部分API?
  3. 不使用状态码很常见?

The server should always return status code 200 except the server dies?

几年前我在软件工程上问过同样的问题:Do web applications use HTTP as a transport layer, or do they count as an integral part of the HTTP server?. See also Should I use HTTP status codes to describe application level events

Specifying various status code is the part of REST API?

不,REST 是 transport-agnostic。它可以 在 HTTP 之上使用,但并不需要。因此它没有说明状态代码。

Not using status code is common?

取决于你问的是谁。

这是一个偏好问题。我非常不喜欢 "What is the most appropriate status code for scenario X?" 问题。此外,还有:

还有很多其他的。我记得有一个站点提供了用于确定(最)合适的状态代码的流程图。

总的来说,不用费心。一致性和详尽的文档记录比分配适当的数字更重要。

团队正在做的事情可能完全适合他们所处的环境。但是将这些模式标记为 REST 听起来不准确。

我这么说是因为听起来团队没有考虑过他们当前的消息传递方案如何与消息交换中的通用 参与者一起工作。

例如,缓存是 REST 架构风格中的一个重要问题。在 HTTP 中,RFC 7234 描述了缓存语义。特别是,有一节介绍如何通过状态代码触发 cache invalidation。这反过来说,如果您不区分成功和不成功情况下的状态代码,那么通用组件将使缓存的条目无效,而这些缓存条目不应无效。

我加入了一个使用完全相同策略的项目 -- 在响应主体中嵌入状态消息,并始终保留状态代码 200。出于一致性原因,最好在软件维护期间遵循现有策略。但是,不推荐用于任何新项目,原因如下:

  1. "Specifying status code like 400, 404, 300" 遵循 RESTful 设计,但它不是 REST 的一部分。实际上,302(重定向)、401(基本和摘要身份验证)、404(Web 服务器中的默认 not-found 页面)、500(默认server error page)是几十年前流行的,早于RESTful API这些天(我知道RESTful是几十年前提出的,但最近几年才流行)。

  2. "Returning always 200 is the right status code because the server responded and it is alive"。这是不正确的。如果是,那么只有 200 可以用于状态代码——只要服务器是 "alive",它就可以 return 消息。 500也不行,那样的话服务器还是"alive",不会死...那么状态码应该一直是200,为什么还要密码?

  3. "Not using status code is common?"。其实恰恰相反。随着RESTfulAPI设计方案越来越流行,越来越多的项目开始使用HTTP状态码来传递消息语义。但无论如何,这是一个opinion-based观点。