返回 HTTP 500 错误描述的最佳做法是什么?
What's the best practice for returning an HTTP 500 error description?
我正在开发一项 API 服务,但我对如何实现 500 次响应感到进退两难。
我不确定发送实际错误原因或只是一般的“内部服务器错误”消息哪个最好。
我能看到的每个参数是:
显式错误描述: 任何使用 API 的客户端都清楚原因,并且可以更容易地向 [=30= 提供反馈] dev 当知道确切的错误原因时。
一般错误: 底层实现对客户隐藏,因为他们不需要知道 API 在幕后如何工作.从这个角度来看,它也可能是针对恶意客户端的更好的安全性。
哪个通常被视为更好的做法,还有其他原因需要考虑吗?
最佳做法是抛出一般错误消息,并尽可能少地向客户端返回信息。如果出于调试目的需要额外的上下文,您可以将该上下文写入 server-side 日志。
例如,在 C# 中:
try
{
// Do something
}
catch (Exception ex)
{
Log.Error("Error details", ex);
return StatusCode(500, "Something went wrong");
}
如果您登录到服务器,请记住混淆任何机密信息(如密码);您应该记录只是足够的相关信息来诊断和解决问题。
我对此(在 Node.js 中)采取的方法如下:
- 未捕获的错误变成
InternalServerError
。例外。
- 我们有一个中间件可以将其转换为标准的
application/problem+json
错误响应。
- 在 dev/testing 中,错误响应包含来自抛出错误的消息。
- 在产品中,这会变成一般错误消息,不会泄露任何内部信息。
- 在所有情况下,我们都会记录真实消息。
- 在我构建的某些系统中,我们在错误响应中发出了一个 'id' 对应于日志中的一个 id,使人们更容易报告问题并让我们更容易查找相关信息。
我正在开发一项 API 服务,但我对如何实现 500 次响应感到进退两难。 我不确定发送实际错误原因或只是一般的“内部服务器错误”消息哪个最好。
我能看到的每个参数是:
显式错误描述: 任何使用 API 的客户端都清楚原因,并且可以更容易地向 [=30= 提供反馈] dev 当知道确切的错误原因时。
一般错误: 底层实现对客户隐藏,因为他们不需要知道 API 在幕后如何工作.从这个角度来看,它也可能是针对恶意客户端的更好的安全性。
哪个通常被视为更好的做法,还有其他原因需要考虑吗?
最佳做法是抛出一般错误消息,并尽可能少地向客户端返回信息。如果出于调试目的需要额外的上下文,您可以将该上下文写入 server-side 日志。
例如,在 C# 中:
try
{
// Do something
}
catch (Exception ex)
{
Log.Error("Error details", ex);
return StatusCode(500, "Something went wrong");
}
如果您登录到服务器,请记住混淆任何机密信息(如密码);您应该记录只是足够的相关信息来诊断和解决问题。
我对此(在 Node.js 中)采取的方法如下:
- 未捕获的错误变成
InternalServerError
。例外。 - 我们有一个中间件可以将其转换为标准的
application/problem+json
错误响应。 - 在 dev/testing 中,错误响应包含来自抛出错误的消息。
- 在产品中,这会变成一般错误消息,不会泄露任何内部信息。
- 在所有情况下,我们都会记录真实消息。
- 在我构建的某些系统中,我们在错误响应中发出了一个 'id' 对应于日志中的一个 id,使人们更容易报告问题并让我们更容易查找相关信息。