【问题标题】:What is the right response for null nested property of resource资源的空嵌套属性的正确响应是什么
【发布时间】:2024-05-20 16:55:02
【问题描述】:

在一个只返回 Json 的 API 上考虑这些端点:

  • GET /cities/{id}/stores
  • GET /cities/{id}/mayor

storemayor 都是可以拥有自己的标量属性的对象。

city->stores 关系是一对多的,而city->mayor 关系是一对一的。在这两种情况下,结果都可以为空。

我同意

GET /stores/{id}GET /cities/{id}GET /mayors/{id} 在具有该 ID 的资源不存在时应返回 404。

但是,如果一个城市没有商店,那么我希望GET cities/{id}/stores 返回[]

我的问题是,鉴于一个城市没有现任市长,应该怎么做? GET /cities/{id}/mayor返回?

【问题讨论】:

    标签: api rest restful-architecture http-response-codes


    【解决方案1】:

    如果给定城市的市长未设置并且存在一对一关系,则应返回404状态码。

    返回 null 值没有意义 - 因为 API 使用者不知道如何处理这个值。

    另一种选择是将此端点从 mayor 更改为 mayors 并始终返回空集合或带有一个条目的集合-但这不是一个好主意,应该很好记录在案,总的来说,我很遗憾我提出了建议;)

    您还可以将市长嵌入城市,然后在返回的 JSON 中将其值设置为 null(如果不存在)。

    【讨论】:

    • 将市长嵌入城市始终是一种选择,但实际上我问这个问题是因为我想避免在响应中嵌入太多嵌套实体,这意味着服务器上有更多的数据库调用侧面和序列化有时代价高昂。另外,如果您开始在响应中嵌套资源,授权检查就会变得很糟糕——您永远不知道在哪里可以看到什么。尽管如此,404 似乎是最合乎逻辑的响应 - 客户端会因为检查资源是否为 null 的属性而收到错误似乎有点奇怪。谢谢!
    • 在这种情况下,也许你应该研究一种资源查询语言?