【问题标题】:REST services - exposing non-data "actions"REST 服务 - 公开非数据“动作”
【发布时间】:2010-03-15 14:13:13
【问题描述】:

我了解如何使用 REST 进行一般实体交互 - 使用 url 名称映射到实体,使用 HTTP 动词映射到这些实体上的操作。但是,人们普遍接受的看待“动作”更像 RPC 的方式是什么?

例如,假设我想发送命令让设备重置?这里没有真正的“实体”,还是我做一些类似 POST 到http://mydevice/device/reset?的事情

【问题讨论】:

    标签: web-services rest restful-url


    【解决方案1】:

    /device/reset/system/reset 都可以。

    REST“设计模式”确实鼓励你不要使用任何动词。你可以这样做:

    POST http://mydevice/system/state    
    <stateType>RESET</stateType>
    

    相关信息:

    【讨论】:

    • 是的,这是一个可能的解决方案。
    【解决方案2】:

    我不认为这是使用 POST 的情况。 “RESET 动作”是一个幂等动作(如果你调用它 n 次,你总是会得到相同的结果),所以恕我直言,你应该使用 PUT 调用而不是 POST(因为 POST 不是幂等的)。

    另外,当你在放置资源时,你可以使用

    PUT http://system
    <device>
      <status>RESET</status>
    </device>
    

     PUT http://system/status/reset
    

    但我认为第一个“更安静”,因为您正在放置资源,而第二个您只需使用 URL。

    【讨论】:

    • 所以你会说 PUT 是一个 UPDATE 而 POST 是一个 INSERT(IBM 而不是 Sun 的定义)?看到这个:stackoverflow.com/questions/2447677/…
    • 不是真的。如果您考虑 CRUD,则可以使用此类比,并且正确地说,如果您有 INSERT 和 UPDATE,则应该分别使用 POST 和 PUT。但幂等性不止于此。想象一下,有一个资源只能在数据库中插入一次,并且永远不应该更改它。这是一个插入和幂等动作,所以在这种情况下我认为会使用 PUT。
    • PUT system/status/reset 带有一个空的主体只是将资源更新为空。第一个是正确的 RESTful 方式。
    • 另外,与您发布的链接不同。 PUT(幂等性和上传资源的表示)的这种使用是 Http 方法的协议所说的,并不是真正的常见用途。 en.wikipedia.org/wiki/…
    • @Jan 我同意你的看法。不过由于我不知道WS的具体用途,我觉得也可以用。
    【解决方案3】:

    我通常将实体命名为“系统”或类似的名称。所以你做“/system/reset”。您已经选择了设备,因此也可以使用。

    但是是的,我通常认为这些类型的操作是更新,它会使用 POST 方法。所以我认为你是正确的 POST 到 /device/reset

    【讨论】:

    猜你喜欢
    • 2011-06-29
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2011-06-27
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多