2016-05-26 25 views
0

我需要为复杂的嵌套资源提供REST API。休息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数据存储

Hovewer集成,我没能找到任何实现这种格式的标准或任何REST API提供者。所有标准通常使用内联嵌入。

有没有什么不利于实施这样的协议?

+0

是你提供你想要实现的样本json吗? –

回答

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. 你坚持REST完整的API设计。检查REST API TutorialRestful best practices

有库(至少在JVM生态系统:的Java,Groovy中,斯卡拉,科特林),支持HAL。如果此表示法不适合您的所有需求,则还可以使用支持根据请求嵌入资源的库,以便您可以覆盖默认的响应嵌入相关资源。

-1

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