2009-07-15 54 views
2

希望有人能帮我解决这个问题。在这些RESTFUL用例中使用哪种HTTP方法?

考虑以下用例:

  1. 添加角色到用户
  2. 卸下/从用户

到系统的接口是RESTFUL吊销作用。

添加了作用,使用以下网址:

PUT /user/{userId}/role/{roleId} 

删除/撤销来自用户的角色,使用以下网址:

DELETE /user/{userId}/role/{roleId} 

我的直觉是这两个RESTFUL调用应该是PUT,并且URL也应该修改:

PUT /user/{userId}/register/role/{roleId} 
PUT /user/{userId}/revoke/role/{roleId} 

想法?

回答

2

创建应该使用POST来完成,因此为用户创建新角色应该是POST而不是PUT,我会说。这取决于你是否考虑添加一个角色来创建一个角色(在这种情况下它是一个POST),或者修改一个用户(然后它是一个PUT)。你用URL表示URL的方式向我表明前者,所以我会用POST。

相同的论点适用于撤销角色。这是对用户的修改还是删除角色?如果前者,那么我会说PUT,如果后者,然后删​​除。

+0

感谢您的回复。我自己将其视为对用户的修改,因为角色已经存在。唯一的创作是关系....有趣的 – JamesC 2009-07-15 09:05:57

0

我自己的看法是,从RESTful的角度来看,DELETE通常是可取的。如果你通过一个事务日志工作,你可以使用PUT--你不只是删除一些权限,你添加一个事务去除你的事务日志的权限,这也意味着每次你会得到一个唯一的ID代表行动。

+0

谢谢您响应。资源User和Role一样有一个ID,但是这种关系不会导致没有唯一的资源ID,这就是为什么我认为PUT更合适。 – JamesC 2009-07-15 09:04:56

0

由于您始终使用Http动词,因此您提供的第一个解决方案非常安静。第二种解决方案不一致,因为您使用PUT来删除某些内容。

如果您要创建一个资源代表注册和撤销的交易,那么你可以做到以下几点:

POST /registrations 

POST /revokations 

现在,在撤销的情况下,更清楚地表明你正在创建一个资源(撤销事务),其具有从用户移除角色的副作用。缺点是,现在您需要一个包含用户和受事务影响的角色的POST主体。

我认为您的第一个解决方案绝对是最好的。

0

我建议使用DELETE进行第二种选择。只要你正在寻找一个唯一的资源,你就应该尝试把这个操作视为在这个资源上完成。所以在你的情况下,你所采取的URL是角色的。所以你从用户下面删除角色。这就是我看到它的方式,它使得阅读变得容易 - RESOURCE方法。

而且,如果您执行PUT,通常会替换RESOURCE,这意味着您将整个资源发送到服务器。

0

一个古老的问题,但URL不应该在OP中修改。 RESTful URL的不得包含动词(registerrevoke。动词表示RPC或REST-RPC混合体系结构。

其他人已经回答了动词的选择问题提得好,但我的2P/2c是: -

POST应该用于创建新资源,PUT用于更新现有