【问题标题】:Array-flattened nested resources in rest api?rest api中的数组扁平化嵌套资源?
【发布时间】:2016-05-26 12:34:37
【问题描述】:

我需要为复杂的嵌套资源提供 REST API。

我不太喜欢内联嵌入,因为它会在响应中强制数据重复,这使得响应更大且更难被前端解释(例如,多辆汽车可以有一个引擎,但我需要在响应中复制它) .

GET /cars
{
  "cars": {
    "id": 1,
    "name": "Batmobile",
    "spoiler": 192, // nested
    "engine": 18 // nested
  },
  "engines": {
    "id": 18,
    "turbine": 671 // nested
    ...
  },
  "spoilers": {
    "id": 192,
    ...
  },
  "turbines": {
    "id": 671,
    ...
  }
}

我想使用以下格式,因为:

  • 数据已标准化
  • 数据很容易与 angular2 数据存储集成

但是,我找不到任何标准或任何实现这种格式的 REST API 提供程序。所有标准通常都使用内联嵌入。

不实现这样的协议有什么缺点吗?

【问题讨论】:

  • 你提供的示例json是你想要实现的吗?

标签: api rest


【解决方案1】:

根据我对您帖子的理解,您希望将原本自然是带有嵌套文档的文档展平。

我看不出扁平化如何提高可读性。此外,它是非正统的,会阻碍对 API 的理解。

在您的示例中,您请求GET /cars,但您正在检索汽车和所有相关资源作为第一级项目。您将如何访问和更新个人资源?

出于以下几个原因,需要将资源嵌套和/或分解到不同的端点:

  1. 客户通常不需要一个请求中的所有汽车及其所有部件。它通常会导航资源,从汽车开始,然后是汽车细节,然后是零件。
  2. 在不同的 URI 上分离资源,每个具有特定的语义有助于使这些资源与资源上的 CRUD 操作保持一致。对于扁平化的表示,这将非常困难。
  3. 不同的 URI 上的不同资源,每个都有其独立的表示,这将帮助您管理您的 API 并包含更改并减少耦合
  4. 如果您尝试构建 REST API,您建议的扁平化表示最终会搞砸。

我建议:

  1. 您将相关资源呈现为链接(HAL 中的行):

    GET /cars [ { "name": "Batmobile", "links": [ { "rel" : "self", "href": "https://api.superauto.com/cars/1" }, { "rel" : "spoiler", "href" : "https://api.superauto.com/spoilers/192" }, { "rel": "engine", "href": "https://api.superauto.com/engines/18" } ] } ]

  2. 将每个资源分别保存在不同的 URI 中

  3. 坚持使用 RESTful API 设计。检查REST API TutorialRestful best practices

有一些库(至少在 JVM 生态系统中:Java、Groovy、Scala、Kotlin)支持 HAL。如果此表示不能满足您的所有需求,您还可以使用支持基于每个请求嵌入资源的库,因此您可以覆盖嵌入相关资源的默认响应。

【讨论】:

    【解决方案2】:

    normalizr 可以帮助您更轻松地将其集成到您的 angular2 数据存储中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多