Rest API为同一资源设计多个URL?

时间:2013-09-04 15:48:14

标签: rest asp.net-web-api

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

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

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

现在,如果我想获取所有网站并忽略用户该怎么办? 我假设有以下网址:

example.com/api/v1/sites

然而,让网站作为根资源和用户的子资源有点奇怪。

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

或者应该是这样的:

example.com/api/v1/users/sites

用户没有ID?

3 个答案:

答案 0 :(得分:2)

对我而言,根据经验,我会看看我从API返回的内容,这通常会告诉我我代表什么。

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

所以,我会选择此网址: 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

答案 1 :(得分:2)

没问题
example.com/api/v1/sites

除了

example.com/api/v1/users

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

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

答案 2 :(得分:2)

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

例如,您可以通过

找出哪个用户“拥有”某个网站
example.com/api/v1/sites/[site_id]/user

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

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

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

example.com/api/v1/addresses/[address_id]

example.com/api/v1/addresses/[address_id]/users =>返回位于该地址的用户,与删除用户的地址类似,您也可以从DELETE上的example.com/api/v1/addresses/[address_id]/users/[user_id]地址中删除用户

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