来自REST API的JSON响应中是否应包含空值?

Den*_*men 44 api rest json

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

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

例:

{
    "fieldA": "AAA",
    "fieldB": null
}
Run Code Online (Sandbox Code Playgroud)

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

例:

{
    "fieldA": "AAA"
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ete 23

最近有关API-Craft的讨论.普遍的共识是,遗漏一个值与包含一个空值之间可能存在语义差异.

如果没有为您的特定用例获得语义值,那么我会说看看API的目标消费者,并考虑是否省略该值会导致问题.

  • 谢谢!我决定采用'null`方法,因为它确实最有意义.我对我们的逻辑实体有几个表示,并添加一个"null"值,更清楚地向客户端传达该字段是表示的一部分但没有数据可用于该字段.事后来看,这是一个真正的_d'oh!_时刻(它才有意义). (5认同)
  • 但我想那么省略这个值会导致这些iOS应用程序崩溃吗?我真的看不出这方面的区别. (5认同)

tkr*_*use 8

没有明显的赢家.而且由于没有,客户永远不应该在技术上依赖任何关于此的约定,客户不应该期望任何形状.

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

  • 如果固执己见的回应是有帮助的。我不同意“保留空值以让人类读者更容易地看到文档结构通常是不合理的”。事实上,API 响应是文档。但总的来说,这是一个需要考虑的很好的清单。感谢您在第一句话中简洁地概括了摘要。 (3认同)