64

我正在设计和开发 RESTful API。我对 API 采取了一种务实的、面向资源的方法(面向资源、统一接口、可寻址性,但没有真正的 HATEOAS)。我不确定的一点是如何处理对象中的空值。

我应该在 API 响应中包含具有空值的字段吗?

例子:

{
    "fieldA": "AAA",
    "fieldB": null
}

或者,如果系统没有这些字段的数据,我应该完全忽略这些字段吗?

例子:

{
    "fieldA": "AAA"
}
4

2 回答 2

37

最近在API-Craft上有一个关于这个的讨论。普遍的共识是,省略一个值与包含一个空值之间可能存在语义差异。

如果没有为您的特定用例获得语义价值,那么我会说看看您的 API 的目标消费者,并考虑省略该值是否会给他们带来问题。

于 2013-03-28T16:27:34.367 回答
25

没有明确的赢家。因为没有,客户在技术上不应该依赖任何关于这个的约定,客户不应该期望任何一种形状。

  • 删除空值以减少带宽使用通常是不合理的(除非空字段的数量很大并且带宽明显受到影响)。
  • 删除空值以使人类读者更容易看到实际值通常是不合理的,API 不是人机界面
  • 保留空值以让人类读者更容易看到文档结构通常是不合理的,API 不是人机界面,API 响应不是 API 文档
  • 保留 null 值以允许脏客户端以特定方式解析 json通常是不合理的,客户端应该被干净地编写为宽容的读者
  • 仅在相应的创建方法(POST/PUT)需要显式传递 null 时才保留 null 值是有意义的,但通常难以实现
  • 当每个文档都有自己的客户端时,在创建期间保持输出与请求相同可能是有意义的,但通常很难实现
  • 需要考虑的一个特殊情况是由类似?fields=foo,bar为所有其他字段返回空值的情况触发的部分响应似乎有点违反直觉
于 2018-05-21T05:54:23.297 回答