【问题标题】:Error response for REST APIREST API 的错误响应
【发布时间】:2018-04-03 20:32:24
【问题描述】:

以下是我的 API 返回给客户端的错误响应:

{
    "statusCode": "400",
    "errors": [
         {
             "errorCode": "50009",
             "fieldName": "bookingDate",
             "errorMsg": "Input bookingDate must lie in the bracket: 20 Jan - 27 Jan, 2018"
         }
     ]
}

客户端无法在 UI 中显示 API 返回的 errorMsg,但它需要括号信息,即(2018 年 1 月 20 日 - 2018 年 1 月 27 日),同时形成一些更有意义的 errorMsg。因此,客户端必须从 API 响应中提取括号信息。

但是,如果更改了 errorMsg 的文本,这可能会破坏客户端的功能。 所以,为了让客户的生活更轻松,我想稍微改变一下错误响应:

{
    "statusCode": "400",
    "errors": [
         {
             "errorCode": "50009",
             "fieldName": "bookingDate",
             "errorMsg": "Input bookingDate must lie in the bracket: 20 Jan - 27 Jan, 2018",
             "startDate": "20 Jan 2018",
             "endDate": "27 Jan 2018"
         }
     ]
}

那么,将 startDate 和 endDate 添加到错误响应中是正确的方法(只是为了客户的利益)还是有其他更好的方法?

提前致谢。

【问题讨论】:

  • 为什么客户端不能显示errorMsg?输入验证 REST API 的一个很好的模式是返回至少一条人类可读的验证错误消息,该消息不会泄露内部信息(例如堆栈跟踪等)
  • 这个API的客户端是支持多种语言的UI。此 API 以英语返回 errorMsg,因此当用户选择的语言是德语时,无法在 UI 中显示。

标签: json spring rest


【解决方案1】:

您可以随意添加任何想要添加到错误响应中的信息。如果它对你真的有用,没有理由不这样做。 Facebook 就是这样做的。另一方面,我会尽量不让错误响应膨胀。

一个设计良好且解耦的 REST API暗示借助 HTTP 错误代码的标准定义来解决大部分错误原因,这些错误代码仍应记录在 API 文档中。鉴于此,客户端的开发人员只有通过解析错误状态才能知道确切的错误。

这也意味着客户端开发人员需要立即检查所有可以检查的内容,而无需向后端发送任何请求。例如,如果给定的日期范围是有效的。

说明这一点,如果无法使用返回的错误代码来找出请求的确切问题,则 API 接口的设计可能不是最佳的。

虽然 REST 只是一个概念,但几乎不可能实现完美的 RESTfull API,因此总是有例外,恕我直言。

【讨论】:

  • 我倾向于不同意客户端的开发人员只有通过解析错误状态才能知道确切的错误。对于验证 REST API,这通常不是。错误状态只会表明输入无效(通常带有400 代码),但不表明究竟是什么 无效(例如,格式错误、范围错误等)。您必须为此添加大量 HTTP 状态代码...
  • 错误的格式和内容通常应该由前端检查。我提到的想法,是一个理想。这意味着实际上可能无法合理实现,但人们应该倾向于这样做。 IHMO
  • @HerrDerb 好吧,在很多情况下验证需要服务器端信息(例如,用户名已经存在)。当然,您可以添加端点以使 UI 能够执行验证……但是,您正在将业务逻辑移动到 UI 中,许多人认为这是一种反模式。我同意应该尝试实现上述理想,但尤其是对于这种端点,肯定存在无法避免的权衡。
【解决方案2】:

虽然这个问题往往会吸引基于意见的答案,但我会尝试提供一些可能有用的提示。

您的 API 似乎可以验证用户输入。此输入可能因各种原因无效(例如,没有可解析的日期、过去的日期等)。这永远不能仅通过 HTTP 状态代码反映出来,因此,返回 HTTP 400 验证错误消息,就像您已经做的那样,是一种很好的做法。

此验证错误消息应该是人类可读的,并且客户端应该可以将其显示给用户。如果包含字段名称(如您的示例中所示),客户端甚至可以突出显示关联的输入字段并在其旁边显示错误消息。

如果您的 API 的使用者不是 UI,而是某种自动化服务,那么与错误相关的技术领域可能更适合需求。 (这就是意见发挥作用的地方:许多人说 API 应该与消费客户端类型无关)。但我认为在您的情况下,您应该调查为什么客户端无法显示 errorMsg - 这应该是将来添加额外验证的最佳和最灵活的方法。

【讨论】:

  • 错误信息将显示在 UI 中。但是 UI 支持多种语言,具体取决于用户的偏好语言。 API 仅以英语返回响应。 UI 必须将此 errorMsg(英文)转换为用户的首选语言。
  • @Azim 根据您的应用程序架构,您可以将本地化移动到您的 API 后端,并通过标准 Accept-Language 标头请求所需的语言。这将意味着 API 和前端之间的耦合更紧密,因此在您的情况下这可能不可行。 (例如,JIRA 通过 REST API 调用从其后端获取大部分(如果不是全部)UI 字符串。)
  • API 端的本地化很好,但需要实现,这在不久的将来不会发生。这个问题主要是关于在错误响应中添加 startDate 和 endDate 是否可以。请编辑您的答案并对此进行更多说明。谢谢:)
  • @Azim:对不起,我无法编辑我的答案,因为这最终只是我的意见。我试图给出一些提示,这些提示可能会帮助您做出决策。您可以随意发现我的回答没有帮助,但这是我所能提供的,抱歉。
猜你喜欢
  • 1970-01-01
  • 2013-10-17
  • 2023-03-20
  • 2013-08-04
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2021-07-03
  • 2017-06-16
相关资源
最近更新 更多