对REST API URI设计有疑问。
让我们考虑每个帖子都有一个或多个标签。因此,可以通过
检索标签GET /posts/1/tags/1
标签以唯一的ID存储在DB中。所以我可以使用
访问标签的完整细节GET /tags/1
如果需要发布信息,那么我可以使用查询参数
GET /tags/1?post=1
我的问题是为什么第一种格式广泛建议使用第二种/第三种格式。
建议我使用案例/场景来选择第一种格式或第二种/第三种格式的并发症。
答案 0 :(得分:1)
为什么第一种格式广泛建议使用第二种/第三种格式。
事实并非如此。这三个用于不同的事情。
您必须首先询问标签是否可以在没有帖子的情况下存在。我说是。因此,第二种形式
GET /tags/1
是获取标记表示的好URI。
接下来,问问自己帖子是否可以有多个标签。我再次说是。因此,第一种形式是获取帖子特定标记的好方法。更一般,表格
GET /posts/1/tags
返回用于帖子1
的所有标记。这是集合资源。其中一个标记是标记1
,可以通过
GET /posts/1/tags/1
请注意,第一个和第二个表单都标识了标记1
。 两个表单可以同时使用。
第三种形式毫无意义。 ?
post=1
之后的查询参数通常用于过滤收集资源。可以说:"为我提供帖子1
,23
和42
上使用的所有标记。这可以表述为
GET /tags?post=1,23,42
这里我们按条件过滤所有标签的集合资源。
您的第三个表单在单个资源上使用查询参数post=1
。但过滤单个标签毫无意义。
第四种形式可能很有用:给我所有使用标记的帖子:
GET /tags/1/posts
这将返回使用标记1
的所有帖子的收藏资源。
即使是一个与第四个含义相同的 fith形式也是可能的:
GET /posts?tag=1
<强>要点:强>
在考虑REST URI时,请考虑资源。你有什么资源?他们之间有什么关系?一种类型的资源只能存在&#34;内部&#34;另一种类型的资源(酒店房间只能存在于酒店内)或者它可以自己存在(即使没有标记帖子也可以存在标签)。什么可能是另一种资源的子资源?存在哪些收集资源?它们如何被过滤?