为什么子资源需要在URI中添加资源?

时间:2015-06-18 17:49:41

标签: api rest

对REST API URI设计有疑问。

让我们考虑每个帖子都有一个或多个标签。因此,可以通过

检索标签
GET /posts/1/tags/1

标签以唯一的ID存储在DB中。所以我可以使用

访问标签的完整细节
GET /tags/1

如果需要发布信息,那么我可以使用查询参数

GET /tags/1?post=1

我的问题是为什么第一种格式广泛建议使用第二种/第三种格式。

建议我使用案例/场景来选择第一种格式或第二种/第三种格式的并发症。

1 个答案:

答案 0 :(得分:1)

  

为什么第一种格式广泛建议使用第二种/第三种格式。

事实并非如此。这三个用于不同的事情。

您必须首先询问标签是否可以在没有帖子的情况下存在。我说。因此,第二种形式

GET /tags/1

是获取标记表示的好URI。

接下来,问问自己帖子是否可以有多个标签。我再次说。因此,第一种形式是获取帖子特定标记的好方法。更一般,表格

GET /posts/1/tags

返回用于帖子1的所有标记。这是集合资源。其中一个标记是标记1可以通过

导航到
GET /posts/1/tags/1

请注意,第一个和第二个表单都标识了标记1两个表单可以同时使用。

第三种形式毫无意义。 ? post=1之后的查询参数通常用于过滤收集资源。可以说:"为我提供帖子12342上使用的所有标记。这可以表述为

GET /tags?post=1,23,42

这里我们按条件过滤所有标签的集合资源。

您的第三个表单在单个资源上使用查询参数post=1 。但过滤单个标签毫无意义。

第四种形式可能很有用:给我所有使用标记的帖子:

GET /tags/1/posts

这将返回使用标记1的所有帖子的收藏资源。

即使是一个与第四个含义相同的 fith形式也是可能的:

GET /posts?tag=1

<强>要点:

在考虑REST URI时,请考虑资源。你有什么资源?他们之间有什么关系?一种类型的资源只能存在&#34;内部&#34;另一种类型的资源(酒店房间只能存在于酒店内)或者它可以自己存在(即使没有标记帖子也可以存在标签)。什么可能是另一种资源的子资源?存在哪些收集资源?它们如何被过滤?