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

在这些RESTFUL用例中使用哪种HTTP方法?,rest,Rest,希望有人能帮我解决这个问题 考虑以下用例: 向用户添加角色 从用户中删除/撤消角色 进入系统的接口是RESTFUL的 添加角色时,使用以下URL: PUT /user/{userId}/role/{roleId} DELETE /user/{userId}/role/{roleId} 从用户中删除/撤销角色时,将使用以下URL: PUT /user/{userId}/role/{roleId} DELETE /user/{userId}/role/{roleId} 我的直觉是,这两个RE

希望有人能帮我解决这个问题

考虑以下用例:

  • 向用户添加角色
  • 从用户中删除/撤消角色
  • 进入系统的接口是RESTFUL的

    添加角色时,使用以下URL:

    PUT /user/{userId}/role/{roleId}
    
    DELETE /user/{userId}/role/{roleId}
    
    从用户中删除/撤销角色时,将使用以下URL:

    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}
    

    想法?

    我自己的看法是,从RESTful的角度来看,删除通常更可取。如果处理事务日志,您将使用PUT——您不仅要删除某些权限,还要将一个事务添加到您的事务日志中,以删除该权限,这也意味着每次执行此操作时,您都会得到一个表示该操作的唯一ID。

    创建操作应使用POST,因此,我认为,为用户创建一个新角色应该是一篇文章,而不是一篇文章。这取决于你是否考虑添加一个角色来创建角色(在这种情况下它是一个帖子),或者修改一个用户(然后它是一个PUT)。你对URL的措辞让我想到了前者,所以我选择了POST


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

    您介绍的第一个解决方案是restful,因为您一直在使用Http谓词。第二种解决方案不一致,因为您使用PUT来删除某些内容

    如果要创建一个资源来表示注册和撤销事务,则可以执行以下操作:

    POST /registrations
    
    POST /revokations
    
    现在,在revoke案例中,更清楚的是,您正在创建一个资源(revoke事务),其副作用是从用户中删除角色。缺点是,现在您需要一个包含用户和受事务影响的角色的帖子正文


    在我看来,您的第一个解决方案绝对是最好的。

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


    而且,如果您确实放置了,通常您会替换资源,这意味着您会将整个资源发送到服务器。

    这是一个老问题,但URL不应像OP中那样进行修改。RESTful URL的不得包含动词(
    注册
    撤销
    。谓词表示RPC或REST-RPC混合体系结构

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

    • 有用户角色的URL:
      http://someapp/user-roles
    • 发布以创建新映射:
      • POST{userId}/{roleId}
        -我的首选项
      • POST{userId};{roleId}
        • 复合路径参数
        • 如何按用户列出角色
      • POST{userId}&role={roleId}
        • 如何按用户列出角色
    • 删除以删除映射
      • 删除{userId}/{roleId}
        -我的首选项

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

    感谢您的回复。资源用户和角色一样有一个ID,但这种关系不会导致没有唯一的资源ID,这就是我认为放置更合适的原因。感谢您的回复。我将其视为对用户的修改,因为该角色已经存在。唯一的创造是关系……有趣的是,这就是为什么我对休息不那么确信。在你尝试对操作进行词组化之前,它看起来都很好,然后变得很混乱。使用PUT创建资源同样有效。唯一的条件是你需要提前知道角色ID。