我在想,如果服务器端发生错误(错误详细信息将包含在响应体中),返回HTTP 200 OK
是否正确。
例如:
- 我们发送
HTTP GET
- 服务器端发生了意外情况。
- 服务器返回带有错误信息的
HTTP 200 OK
状态码作为响应(例如:{"status":"发生了一些错误"}
)
这是否是正确的行为?我们是否应该将状态码更改为不同于200的内容?
我在想,如果服务器端发生错误(错误详细信息将包含在响应体中),返回HTTP 200 OK
是否正确。
例如:
HTTP GET
HTTP 200 OK
状态码作为响应(例如:{"status":"发生了一些错误"}
)这是否是正确的行为?我们是否应该将状态码更改为不同于200的内容?
不,发送带有错误主体的200是非常不正确的。
HTTP是一种应用协议。200表示响应包含代表所请求资源状态的有效载荷。错误消息通常不是该资源的表示形式。
如果在处理GET时出现问题,则正确的状态代码为4xx(“你搞砸了”)或5xx(“我搞砸了”)。
HTTP状态码是关于HTTP协议的内容。 HTTP 200
意味着在HTTP层面上传输正常(即请求在技术上正常,服务器能够正确响应)。请参见这个维基页面以获取所有代码及其含义的列表。
HTTP 200
与您的“业务代码”的成功或失败无关。在您的示例中,只要没有技术问题阻止了业务逻辑的正常运行,HTTP 200
就是指示您的“业务代码错误消息”已成功传输的可接受状态。
或者,如果服务器发生技术或不可恢复问题,则可以让服务器响应HTTP 5xx
。如果传入请求存在问题(例如,错误的参数,意外的HTTP方法...),则可以响应HTTP 4xx
。这些都表示技术性错误,而HTTP 200
表示没有技术性错误,但不能保证业务逻辑错误。
总之:是有效的将错误消息(针对非技术问题)与HTTP状态200一起发送到您的http响应中。是否适用于您的情况取决于您。例如,如果客户端正在请求不存在的文件,则更像是404
。如果服务器存在错误配置,则可能是500
。如果客户端要求预订已满的飞机座位,则为200
,您的“实现”将决定如何识别/处理此请求(例如,使用一个包含{"booking":"failed"}
的JSON块)。
{"booking":"failed","reason":"plane is full"}
。这完全可以返回HTTP 200,事实上(在我看来)这是唯一有效的HTTP状态码。 - geert3我认为如果我们考虑现实生活,就可以解决这些问题。
糟糕的实践:
例子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 错误代码,而不要使用 HTTP 状态代码来发送业务逻辑错误。
像“余额不足”、“没有可用出租车”、“用户名/密码不正确”等错误符合使用状态码为 200
,并在响应体中进行应用程序特定的错误处理。
参见此软件工程回答:
我认为明确分离协议更好。让 HTTP 服务器和 Web 浏览器各自做自己的事情,让应用程序做自己的事情。应用程序需要能够发出请求,并需要响应 - 它的请求方式以及如何解释响应的逻辑可以比 HTTP 层面更加复杂(或简单)。