在 JSend 规范中,失败和错误有什么区别?

chi*_*okh 3 rest json jsend

根据https://labs.omniti.com/labs/jsend

  • 失败:当 API 调用因无效数据或调用条件而被拒绝时
  • 错误:当 API 调用因服务器错误而失败时

这是否可以解释为 4xx 错误(例如 404)应始终返回失败,但 5xx 错误始终对应于错误?

小智 6

这是一个很好的问题,我将根据我自己的经验用一个具体的例子来回答它。在我的一个项目的 API 中,我允许上传 Excel 电子表格,该电子表格经过处理并将生成的 JSON 存储在服务器上。

如果将数据保存到磁盘时出现错误,那么我会以 JSend“错误”以及相应的错误消息作为响应,因为数据应该能够被保存。

另一方面,如果其中一行中的数据无效(可能是数据类型不正确或范围错误),那么我知道电子表格中不正确的确切行(或行)。在这种情况下,“失败”响应是合适的data,因为 JSend 响应的属性将包含每个不可处理行的所有行(行号和错误消息)的列表。

在“错误”响应的情况下,我不会有这种能力,因为我将仅限于单个message属性。但是有了“失败”响应,我就有了data可用的属性,我可以用一个细粒度的问题列表来响应。

因此,虽然没有错误,但数据本身并不正确,用户应该返回并查看他们的电子表格并修复data“失败”响应中属性确定的问题。

从 HTTP 错误的角度考虑这一点,虽然是一个有趣的练习,但并不总是会产生精确的映射(4xx = 失败,5xx = 错误)。它更多地是关于您想与客户端通信的内容:发生了不应该发生的坏事(“错误”)或服务器工作正常但您的数据不完全符合标准(“失败”)。

最后,您是否还想使用 HTTP 错误完全取决于您。你总是可以用 200 来回应,让 JSend 来说话。但这是一个稍微不同(有点宗教)的讨论。:-)

我希望这有帮助。

  • 我个人认为,将 JSend 用于 REST API 时,根本问题是 JSend 拒绝将 HTTP 标头作为 REST API 的组成部分。JSend 的“status”字段是多余的,因为此信息已经在“Status”HTTP 标头中(它们甚至被称为相同的东西)。“该规范的目的是尽可能小、受限制且普遍适用。因此,它必须在某种程度上是独立的。” - 但 REST 应该包含 HTTP 标头和动词,而不是假装它们不存在。 (2认同)