我最近加入了一个新项目。在此项目中,所有服务中的所有API始终返回状态代码200。即使该响应应为400或404,API返回状态代码200。
我问了为什么API不返回其他响应代码的原因,程序员告诉我他们不使用响应代码。他们将信息放在体内。
例如,有一些必需的字段,它们返回响应状态代码200,但身体像这样
返回{"result" : "fail"}
如果未经授权的用户试图访问,则状态代码为200,身体返回如下
{"result" : "unautherized"}
我以前所做的事情非常不同,我总是通过案例指定状态代码,并尝试返回合适的状态代码和消息。我认为这是HTTP协议的一部分。但是,他们告诉我指定状态代码,例如400、404、300,是RESTFUL API的一部分,并且始终返回200是正确的状态代码,因为服务器响应并且还活着。API,始终必须返回200,除了500。因为当服务器死亡时,它无法返回任何东西。
所以这些是问题。
- 服务器应始终返回状态代码200,但服务器死亡?
- 指定各种状态代码是REST API的一部分?
- 不使用状态代码是常见的吗?
服务器应始终返回状态代码200,但服务器死亡?
几年前,我在软件工程上询问了同样的问题:Web应用程序是否使用HTTP作为传输层,还是将其视为HTTP服务器的组成部分?另请参见我应该使用HTTP状态代码来描述应用程序级别事件。
指定各种状态代码是REST API的一部分?
不,休息是运输不可能的。它可以在HTTP顶部使用可以使用,但不需要。因此,它没有说明状态代码。
不使用状态代码是常见的吗?
取决于您问谁。
这是一个偏爱问题。我非常不喜欢"方案x最合适的状态代码是什么?" 问题。另外,还有:
- HTTP状态代码
- HTTP响应状态代码 - REST API教程
和其他许多人。我记得有一个网站提供流程图,以确定(最(适当的状态代码。
一般而言,不要打扰。一致性和详尽的文档比分配适当的数字更重要。
我加入了一个使用完全相同策略的项目 - 将状态消息嵌入响应主体内,并将状态代码始终为 200
。出于一致原因,最好在软件维护时间遵循存在的策略。但是,不建议任何新项目都使用:
"指定如400、404、300" 之类的状态代码遵循静止的设计,但这不是休息的一部分。实际上,使用
302
(重定向(,401
(基本和摘要身份验证(,404
(Web Server中的默认未找到页面(,500
(默认服务器错误页面(几十年前很流行,早于这些天的Restful API(我知道宁静是几十年前提出的,但仅在近年来才流行(。"返回始终200是正确的状态代码,因为服务器响应并且已经活着" 。这是不正确的。如果是这样,则只能将
200
用于状态代码 - 只要服务器为"活着",它就可以返回消息。500
也不是可以接受的,因为在这种情况下,服务器仍然"活着",它不会死亡...然后,由于状态代码应该始终是200
,为什么我们需要代码?"不使用状态代码是常见的吗?" 。实际上,这是相反的。由于RESTFUL API设计方案越来越流行,因此越来越多的项目使用HTTP状态代码来传递消息语义。但是无论如何,这是一个基于意见的观点。
团队所做的事情可能完全适合于他们所处的情况。但是将这些模式标记为不准确。
我这么说,因为听起来团队没有考虑到他们当前的消息传递方案如何与 generic 参与者一起使用。
例如,缓存是其余体系结构风格的重要问题。在HTTP中,RFC 7234描述了缓存语义。特别是,有一个有关如何通过状态代码触发缓存无效的部分。这反过来说,如果您不区分成功和失败的情况下的状态代码,那么通用组件将是无效的缓存条目,不应无效。