4

在我的 API 中,我有以下资源:

example.com/api/v1/users/me/sites
example.com/api/v1/users/123/sites

返回当前或给定用户的所有站点。

现在,如果我想获取所有站点并忽略用户怎么办。我假设它将具有以下 URL:

example.com/api/v1/sites

这让我觉得将网站作为根资源和用户的子资源有点奇怪。

这是一种好的方法还是以其他方式这样做很常见?

或者应该是这样的:

example.com/api/v1/users/sites

哪里没有用户的ID?

4

3 回答 3

3

对我来说,根据经验,我会查看从 API 返回的内容,这通常会告知我所代表的内容。

例如,您实际上返回的是站点,而不是 URL 的用户:example.com/api/v1/users/123/sites。在这种情况下,我更愿意寻址站点,因为这就是返回的内容。

所以,我会选择这个 URL:example.com/api/v1/sites ?user=123

恕我直言,这是利用查询字符串作为网站的实际查询。

因此,对于站点表示,我会这样构建它:

  1. 所有站点:example.com/api/v1/sites

  2. 特定站点:example.com/api/v1/sites/1

  3. 用户的站点:example.com/api/v1/sites ?user=123

  4. 当前用户的站点:example.com/api/v1/sites ?user=current

于 2013-09-04T16:00:32.020 回答
2

有没有问题

example.com/api/v1/sites

除了

example.com/api/v1/users

特别是每个似乎都是一个根聚合。

因此,如果关联是组合而不是聚合(站点和用户之间),那么将它们作为根 URL 片段不仅可以,而且是正确的。

于 2013-09-04T16:13:27.747 回答
2

我想为这个有趣的问题添加一些东西。

例如,您可以通过以下方式找出哪个用户“拥有”某个网站

example.com/api/v1/sites/[site_id]/user

这将返回拥有 site_id 站点的用户资源。

另一个例子可能是用户和地址。如果您允许用户共享地址资源(地址可以有多个用户),您可以这样做:

example.com/api/v1/users/[user_id]/address=> 返回带有 user_id 的用户的地址。在该路径上执行DELETE操作不会删除整个地址资源,而只会删除用户与地址之间的连接。要删除地址本身,您应该DELETEexample.com/api/v1/addresses/[address_id]

example.com/api/v1/addresses/[address_id]/users=> 返回居住在该地址的用户,与从用户中删除地址类似,您也可以使用DELETEon从地址中删除用户example.com/api/v1/addresses/[address_id]/users/[user_id]

Address 和 User 之间的关系(@Aliostad 将关联称为组合)本身就是一种资源,可以在不删除资源本身的情况下访问和删除。

于 2014-06-10T10:21:36.930 回答