在我的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?
答案 0 :(得分:2)
对我而言,根据经验,我会看看我从API返回的内容,这通常会告诉我我代表什么。
例如,您实际上是返回网站,而不是URL的用户:example.com/api/v1/users/123/sites。在这种情况下,我更愿意处理网站,因为这是返回的内容。
所以,我会选择此网址: example.com/api/v1/sites?user=123
恕我直言,这是利用查询字符串作为网站的实际查询。
因此,对于网站表示,我会像这样构建它:
所有网站: example.com/api/v1/sites
特定网站: example.com/api/v1/sites/1
用户的网站: example.com/api/v1/sites?user=123
当前用户的网站: 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称为关联作为组合)本身就是一种资源,可以在不删除资源本身的情况下访问和删除。