RESTful API设计:是否应该鼓励/避免为特定资源的属性提供特定的子URI?

RESTful API设计:是否应该鼓励/避免为特定资源的属性提供特定的子URI?,rest,api-design,Rest,Api Design,设计一个尽可能RESTful的API,我想知道用特定的子URI划分资源是否合适 让我们使用以下URI: 获取/用户:列出用户 GET/users/42:获取id=42的用户的详细信息,例如: { id:42, 名字:完成, 姓:乔, 是否处于活动状态:false } 我将把活动状态看作它自己的资源: GET/users/42/is_active:获取id=42的用户的活动状态 { 是否处于活动状态:false } PUT/users/42/is_active:设置id=42的用户作为主体的活动状

设计一个尽可能RESTful的API,我想知道用特定的子URI划分资源是否合适

让我们使用以下URI:

获取/用户:列出用户 GET/users/42:获取id=42的用户的详细信息,例如:

{ id:42, 名字:完成, 姓:乔, 是否处于活动状态:false } <>我将把活动状态看作它自己的资源:

GET/users/42/is_active:获取id=42的用户的活动状态

{ 是否处于活动状态:false } PUT/users/42/is_active:设置id=42的用户作为主体的活动状态:

{ 是否处于活动状态:false }
这样做有什么好处或坏处吗?

你说的是所谓的微资源。它对于以幂等方式进行部分更新非常有用。它在更知名的API中并不流行,但它确实是一种有效的设计方法。

谢谢,不幸的是,即使知道这个概念背后的名称也不能帮助我找到关于它的资源。您是否有一些资源可供分享以认可您的答案?@Patrickallert Miller metions先生此处:。我已经和其他开发者谈过了,但是我对互联网上的其他东西都不熟悉。你到底想弄清楚什么?我在这一点上支持@EricStein。你唯一的选择是使用补丁,这是相当复杂的,不值得的努力大部分时间。如果您决定使用子资源方法,如果您想实现RESTful,请不要忘记链接它。我不会选择这样的设计来避免客户的混淆。例如,如果用户42不存在,但您执行了一个PUT on is_active,那么在您的情况下会发生什么?它是否创建了用户?它会抛出错误吗?如果是后者,出于“稳健性原则”的考虑,我尽量避免这样做->在你做的事情上要保守,在你接受别人的事情上要自由。@Dr.UnitTest它将返回404,与他们调用PUT/users/42完全相同。我不同意稳健性原则在这种情况下适用。@EricStein我同意它不完全适合,但一点也不适合?显然,您知道用户想要做什么->创建或完全更新资源PUT/user/123。那么,为什么您会返回一个未找到的错误/或者说,保守一点,仅仅因为您可能不想让客户机选择资源的ID,而让客户机这样做。但撇开它不谈,PUT只是一个例子。执行任何其他HTTP操作。删除这样一个微资源会导致什么?如果删除它,您必须如何重新创建它?那么推杆可以吗?那么,为什么突然允许PUT创建一些东西呢?我认为在大多数情况下,这会使系统的使用变得更加困难,因为不同的规则适用于“正常”资源而不是微资源。@DXTR66不必支持所有HTTP操作。在/users/42不存在的情况下,我看不到补丁/users/42和PUT/users/42/属性之间有什么区别,对于/users/42/friends这样的子集合也没有什么区别。在这种情况下,允许的方法记住,查询资源上可能的方法是可能的,选项为PUT&GET only。