4

假设我有一个parent代表一组数据的资源。像这样的宁静 URL 结构应该非常简单:

  • GET /api/parents - 返回所有父母的集合
  • GET /api/parents/1 - 返回 id = 1 的父级
  • POST /api/parents - 向集合添加新的父级
  • PUT /api/parents/1 - 更新 id = 1 的父项中的数据
  • DELETE /api/parents/1 - 删除 id = 1 的父级

现在说每个parent都是由child资源的集合组成的。子资源 id 是否应该被视为具有全局或本地范围?我相信给出了以下 2 个 URL:

  • GET /api/parents/1/children - 返回父 1 的孩子的集合
  • POST /api/parents/1/children - 将新子添加到父 1 的集合

但是 GET、PUT 和 DELETE 呢?以下哪项是合适的?

  • 获取、放置或删除 /api/parents/44/children/6
  • 获取、放置或删除 /api/parents/children/6

似乎它归结为child资源 ID 的唯一性范围。ID 是否仅在父聚合中唯一?还是在所有父母的所有孩子中都是独一无二的?一个比另一个更正确,还是取决于相关资源的 id 唯一性范围?

如果示例 1 比示例 2 更合适,并且 id = 44 的父级没有 id = 6 的子级(例如子级 id = 6 属于 id = 9 的父级),应该返回什么 HTTP 响应?

4

3 回答 3

3

@danludwig

我认为它实际上并不重要,因为 URI 只是资源标识符,所有这些用户友好的层次结构只对人类很重要......但无论哪种情况,我都会问关于这个“/api/parents/children/”的问题6",让我们分解一下:

  • GET to "/api/parents/children/6" 为我们提供子资源
  • 获取到“/api/parents/children”这里会发生什么?404?
  • GET到“/api/parents”给了我们所有的父母
  • GET 到“/api”,希望是主页(或索引)文档,其中包含指向其他从属资源的链接。

我认为在构建分层 URI 时这是一个很好的测试。只需确保每个段都绑定到特定资源并且不返回 404。

于 2012-10-27T18:47:09.813 回答
1

Is the ID unique only within the parent aggregate? Or is it unique among all children of all parents?

This would depend on the possibility of a child being the cild of one and only one parent. If this is the case, then locally scoped IDs are possible.

If, on the other hand, a child can be child of more than one parent, gloabally scope IDs would be necessary.

Of course one can ask if a child which has a global ID can only exist 'below' a parent, or if such a child can be addressed with an URL that does not contain a parent.

于 2012-10-29T08:01:07.733 回答
0

URL在GET, PUT or DELETE /api/parents/44/children/6我看来是因为它指示了父资源和子资源之间的关系。

唯一的问题是您需要知道父 ID 才能使用子资源。

一种替代方法是一起删除 URL 的“父”部分:GET, PUT or DELETE /api/children/6并在子资源中拥有一个“链接”属性或元素,为其父资源提供 URL。

<child>
   <id>6</id>
   <link rel="parent" href="/api/parents/1" />
   ...
</child>
于 2012-10-27T19:17:31.383 回答