在这些RESTFUL用例中使用哪种HTTP方法?

时间:2009-07-15 08:50:44

标签: rest

希望有人可以帮我解决这个问题。

考虑以下用例:

  1. 向用户添加角色
  2. 从用户删除/撤消角色
  3. 进入系统的界面是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}
    

    思想?

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我自己认为,从RESTful的角度来看,DELETE通常是可取的。如果您处理事务日志,则可以使用PUT - 您不仅仅删除了一些权限,添加了一个删除事务日志权限的事务,这也意味着每次执行时都会获得一个表示该事务日志的唯一ID动作。

答案 2 :(得分:0)

您提供的第一个解决方案是一致的,因为您始终使用Http动词。第二种解决方案不一致,因为您正在使用PUT删除某些内容。

如果您要创建一个资源来表示注册和撤销的交易,那么您可以执行以下操作:

POST /registrations

POST /revokations

现在,在撤销的情况下,您更清楚的是创建一个资源(撤销事务),其副作用是从用户中删除角色。缺点是现在您需要一个包含用户的POST主体以及受事务影响的角色。

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

答案 3 :(得分:0)

我建议使用DELETE作为第二个选项。只要您唯一地定位资源,就应该尝试将操作视为在该资源上完成。因此,在您的情况下,您所处理的URL是Role的。所以你从用户下面删除角色。这就是我看到它并且易于阅读的方法 - 关于RESOURCE的方法。

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

答案 4 :(得分:0)

一个老问题,但不应像在OP中那样修改网址。 RESTful网址不得包含动词(registerrevoke。动词表示RPC或REST-RPC混合体系结构。

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

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