返回 HTTP 500 错误描述的最佳做法是什么?

What's the best practice for returning an HTTP 500 error description?

我正在开发一项 API 服务,但我对如何实现 500 次响应感到进退两难。 我不确定发送实际错误原因或只是一般的“内部服务器错误”消息哪个最好。

我能看到的每个参数是:

  1. 显式错误描述: 任何使用 API 的客户端都清楚原因,并且可以更容易地向 [=30= 提供反馈] dev 当知道确切的错误原因时。

  2. 一般错误: 底层实现对客户隐藏,因为他们不需要知道 API 在幕后如何工作.从这个角度来看,它也可能是针对恶意客户端的更好的安全性。

哪个通常被视为更好的做法,还有其他原因需要考虑吗?

最佳做法是抛出一般错误消息,并尽可能少地向客户端返回信息。如果出于调试目的需要额外的上下文,您可以将该上下文写入 server-side 日志。

例如,在 C# 中:

try
{
    // Do something
}
catch (Exception ex)
{
    Log.Error("Error details", ex);
    return StatusCode(500, "Something went wrong");
}

如果您登录到服务器,请记住混淆任何机密信息(如密码);您应该记录只是足够的相关信息来诊断和解决问题。

我对此(在 Node.js 中)采取的方法如下:

  1. 未捕获的错误变成 InternalServerError。例外。
  2. 我们有一个中间件可以将其转换为标准的 application/problem+json 错误响应。
  3. 在 dev/testing 中,错误响应包含来自抛出错误的消息。
  4. 在产品中,这会变成一般错误消息,不会泄露任何内部信息。
  5. 在所有情况下,我们都会记录真实消息。
  6. 在我构建的某些系统中,我们在错误响应中发出了一个 'id' 对应于日志中的一个 id,使人们更容易报告问题并让我们更容易查找相关信息。