我想知道HTTP 200 OK
服务器端发生错误时返回的错误是否正确(错误详细信息将包含在响应正文中)。
例:
- 我们正在发送
HTTP GET
- 服务器端发生了意外情况。
- 服务器
HTTP 200 OK
在响应内返回错误的状态代码(例如{"status":"some error occurred"}
)
这是正确的行为吗?我们应该将状态代码更改为200以外的其他值吗?
我想知道HTTP 200 OK
服务器端发生错误时返回的错误是否正确(错误详细信息将包含在响应正文中)。
例:
HTTP GET
HTTP 200 OK
在响应内返回错误的状态代码(例如{"status":"some error occurred"}
)这是正确的行为吗?我们应该将状态代码更改为200以外的其他值吗?
Answers:
不,这是非常不正确的。
HTTP是一种应用程序协议。200表示响应包含表示请求资源状态的有效负载。错误消息通常不表示该资源。
如果在处理GET时出现问题,则正确的状态代码为4xx(“您搞砸了”)或5xx(“我搞砸了”)。
HTTP状态代码说明了有关HTTP协议的内容。HTTP 200
表示在HTTP级别上传输正常(即,请求在技术上正常,服务器能够正确响应)。有关所有代码及其含义的列表,请参见此Wiki页面。
HTTP 200与您的“业务代码”的成功或失败无关。在您的示例中HTTP 200
,如果没有技术问题阻止业务逻辑正常运行,则表明您的“业务代码错误消息”已成功传输是可接受的状态。
或者,HTTP 5xx
如果服务器上发生技术或不可恢复的问题,您可以让服务器做出响应。或者,HTTP 4xx
如果传入的请求有问题(例如,错误的参数,意外的HTTP方法...),则所有这些都表示技术错误,而HTTP 200
表示没有技术错误,但不能保证业务逻辑错误。
总结:是的,在HTTP响应中连同HTTP状态200发送错误消息(针对非技术问题)是有效的。这是否适用于您的情况取决于您。例如,如果客户要求的文件不存在,那将更像是404
。如果服务器上的配置错误可能是500
。如果客户要求在预订满的飞机上占座,那应该是200
,您的“实现”将规定如何识别/处理该座位(例如带有的JSON块{ "booking","failed" }
)
{"booking":"failed","reason":"plane is full"}
。为此,获取HTTP 200完全可以,实际上(IMHO)这将是唯一有效的HTTP状态代码。
为了明确起见,您应该在适合协议的地方使用HTTP错误代码,而不要使用HTTP状态代码发送业务逻辑错误。
诸如余额不足,没有可用的出租车,错误的用户名/密码之类的200
错误都有资格通过响应正文中的应用程序特定错误处理获得HTTP状态。
看到这个软件工程答案:
我要说的是,最好明确协议的分离。让HTTP服务器和Web浏览器做好自己的事情,并让应用程序做它自己的事情。该应用程序需要能够发出请求,并且需要响应-其关于如何请求,如何解释响应的逻辑可能比HTTP透视图复杂(或更少)。
我认为,如果我们考虑现实生活,就会解决这些问题。
不良做法:
范例1:
Darling everything is FINE/OK (HTTP CODE 200) - (Success):
{
...but I don't want us to be together anymore!!!... (Error)
// Then everything isn't OK???
}
范例2:
You are the best employee (HTTP CODE 200) - (Success):
{
...But we cannot continue your contract!!!... (Error)
// Then everything isn't OK???
}
良好做法:
Darling I don't feel good (HTTP CODE 400) - (Error):
{
...I no longer feel anything for you, I think the best thing is to separate... (Error)
// In this case, you are alerting me from the beginning that something is wrong ...
}
这只是我个人的观点,每个人都可以实施它,因为它是最舒适或最需要的。
注意:这种解释的想法来自一个好朋友@diosney
HTTP是用于处理Internet上数据传输的协议。
如果由于某种原因传输中断,HTTP错误代码会告诉您为什么无法将其发送给您。
HTTP错误代码未处理正在传输的数据。只有传输方法。
HTTP不能说“好吧,这个答案是gobbledigook,但是这里是”。它只是说200 OK
。
即:我已经完成了将它交给您的工作,其余的一切取决于您。
我知道已经回答了这个问题,但是我用我能理解的话说了一下。对不起,我很重复。
我认为人们对应用程序逻辑和协议问题的重视程度过高。重要的是,响应应该合理。如果您有一个提供动态资源的API并向X发出请求,该请求是从具有数据Z的模板Y派生的,而Y或Z当前不可用?这是业务逻辑错误还是技术错误?正确的答案是:“谁在乎?”
您的API和响应必须清晰易懂且一致。它应符合某种规范,并且该规范应定义什么是有效响应。符合有效响应的内容应产生200码。不符合有效响应的内容应产生4xx或5xx代码,以指示为什么无法生成有效响应。
如果您的规范对有效响应的定义允许{ "error": "invalid ID" }
,则表示响应成功。如果您的规范没有做到这一点,那么用200代码返回该响应将是一个糟糕的决定。
我可以比喻调用一个函数parseFoo
。打电话时会parseFoo("invalid data")
怎样?它是否返回错误结果(可能为null)?还是引发异常?对于一种方法或另一种方法是否正确,许多人会采取近乎宗教的立场,但最终取决于API规范。
“状态码元素是一个三位数的整数代码,给出尝试理解和满足请求的结果”
显然,关于“成功返回错误”是否构成HTTP成功还是错误存在意见分歧。我看到不同的人以不同的方式解释相同的规范。因此,当然要选择一方,但也要接受,无论哪种方式,整个世界都不会同意您的看法。我?我发现自己处于中间位置,但是我会提供一些常识性的考虑。
500 Internal Server Error
。这似乎是OP的情况。应用程序不应200
为意外错误返回a ,还请参见第3点。在OP的情况下,听起来好像您有一个事实上的标准,未处理的异常会产生200,并带有可区分的响应主体。这不是理想的选择,但是如果没有解决问题并积极地引起问题,则可能需要解决更大,更重要的问题。