在REST API中指定层次结构

时间:2015-10-15 19:52:51

标签: json api rest

是的,我知道没有严格的规则,是的,我已经阅读了其他堆栈帖子。

鉴于这个例子,我有几种方法可以认为可以做到这一点。我正在寻找的是人们指定等级制度的任何其他想法或方式。

我喜欢尽可能多地在uri中识别资源。例如,我不想把所有内容放入查询字符串,它只是我的首选:

/cars/10/colors/2 - 一个共同的惯例

-OR -

/cars/10?colors=2 - 另一种常见惯例

我更喜欢先查找资源并识别它,然后在查询字符串中添加过滤。这是不基于ID或名称匹配的过滤,但您可以说要添加到查询中的内容,例如greaterThan,排序等。

有了这个,我想知道人们是否也成功地这样做了。现在这里变得复杂了。我想深入研究属性的属性。

假设我们在API中定义了以下资源和关系:

汽车 (这些是我们发送回代码并在请求/响应中期望的代码中的实体。显然GET不会有对象)

{
   id:null,
   colors: null,
   year: null,
   engines: null
}
填充时,

颜色将是json颜色对象的数组 当填充

时,引擎会出现一组引擎json对象

所以这些是Car所拥有的几种关系。

颜色

{
    name: null,
    tone: null
}

发动机

{
     name: null,
     horsepower: null,
}

现在假设我想让我们的用户真正指定一些更复杂的过滤,但是在第二级。你是怎么做到的?

我能想到几种方式:

/cars/10/engines.horespower:v4?[and then some other filtering or actions added here like sorting, limiting, paging, etc...]

或者这里的另一个例子是:/people/locations.cities.id:124? ...

所以一个人json对象有一个locations属性。一个位置json对象有一个id属性..这就是我如何考虑这个例子/场景。

我不想做这样的事情:

/cars/engines?name=c5000

这打破了REST约定,因为我实际上并没有在这里指定一个层次结构。你可能认为你是,但这才是真正的说法......我希望引擎不是这种网址的汽车,因为引擎是网址中的最后一种资源类型。这次URI中没有指定params ...而上次我们有/cars/10/engines.horespower:v4而且这意味着一个层面因为我使用一段时间来指定引擎的子属性而且因为我设置了它是一个值,以便uri的一部分现在成为一个参数。

我确定你可以找到另一种方式让用户通过获取你想要的资源的子属性进行过滤,但是你必须弄清楚如何,这不是一件容易的事,因为你想要确保你提出的模式对于任何对象都是可扩展的和可重用的,就用户如何指定查询,分页而言,更重要的是在这种情况下对我来说,获取嵌套属性并对它们采取行动。

想法?经验?想法?

0 个答案:

没有答案