restapi中的命令建模

restapi中的命令建模,rest,api-design,Rest,Api Design,我正在寻找一种很好的方法来对在RESTAPI中更改资源状态的命令进行建模。我浏览了互联网,找到了各种各样的解决方案,我想得到这些方案的优缺点的反馈 考虑一个具有“isActive”状态的资源。如果资源的当前“isActive”状态为false,则可以使其处于活动状态,反之亦然 解决方案: 客户机将|补丁放入具有新状态的资源 优点:非常简单 缺点:没有很好的方法来提供超媒体来向客户端指示资源可以被激活/停用 客户端发布到资源/{id}/activate。(无需正文。) 优点:超媒体驱动。直觉

我正在寻找一种很好的方法来对在RESTAPI中更改资源状态的命令进行建模。我浏览了互联网,找到了各种各样的解决方案,我想得到这些方案的优缺点的反馈

考虑一个具有“isActive”状态的资源。如果资源的当前“isActive”状态为false,则可以使其处于活动状态,反之亦然

解决方案:

  • 客户机将|补丁放入具有新状态的资源

    • 优点:非常简单
    • 缺点:没有很好的方法来提供超媒体来向客户端指示资源可以被激活/停用
  • 客户端发布到资源/{id}/activate。(无需正文。)

    • 优点:超媒体驱动。直觉的
    • 缺点:不是真正的RESTful(因为动作是在Uri中传递的)
  • 客户端发布到资源/活动或资源/非活动。(正文包含应添加到活动资源集合的资源的id)

    • 优点:超媒体驱动
    • 缺点:不像选项2那样直观
  • 客户端对资源/{id}/isactive进行发布或删除,以指示该资源是否处于活动状态

    • 优点:超媒体驱动
  • 你还知道其他的方法吗

    我非常喜欢选项3,但在网上的任何地方都没有见过这种方法,所以它可能违反了REST的一些原则

    引用:

    将其视为具有RESTful原则的子资源。例如,GitHub的API允许您使用
    PUT/gists/{id}/star
    DELETE/gists/{id}/star

    将此方法应用于您的案例:

    • 正在激活:
      PUT/resources/{id}/active
    • 停用:
      DELETE/resources/{id}/active

    这主要是我的观点,但我在野外看到的最喜欢的设计是拥有相对无状态的实体和对实体产生副作用的事件系统。所以它会在2到3之间。您基本上是在api中发布和创建激活或停用事件。这还有一个副作用,就是保持动作的自然记录。