【问题标题】:Other RESTful actions on a resource对资源的其他 RESTful 操作
【发布时间】:2012-05-22 22:37:20
【问题描述】:

假设我有代表图像的资源

PUT /images/[id] with path -> 如果已经存在更新我的资源,将为我创建一个新的图像资源

POST /images/[id] -> 更改或更新资源 例如,图像名称

DELETE /images/[id] -> 这将删除我的资源

GET /images/[id] -> 获取图片详细信息

现在是实际问题。如果我需要向图像添加其他操作怎么办?假设图像资源将响应减少红眼操作或任何其他类似裁剪、调整大小

那么这些动作是如何考虑的,在restful接口中应该如何调用呢?

/images/[id]/remove_redeye

/images/[id]/crop

/images/[id]/resize

以上调用在restful接口中有效吗?我对应该考虑哪些操作感到困惑(PUT POST)?

【问题讨论】:

    标签: rest


    【解决方案1】:

    “消除红眼”、“裁剪”和“调整大小”听起来都像是“更改或更新资源”的操作。他们将属于 PUT 动作。 (我认为您在问题中混淆了 PUT 和 POST,请参阅 the verbs listed at w3c。)

    您如何传达操作的性质取决于发布的内容。例如,如果我们谈论的是位于数据库记录之上的表单,那么 POST 就是该记录的数据。没有必要指定正在更改哪些字段,因为整个对象正在以新状态发布。

    在这种情况下,整个对象是否以新状态发布?还是该对象仅存在于服务器端,而接口只是发送某种操作的请求?根据提供的信息,在我看来是后者。

    在这种情况下,您可以在 POST 中包含有关该操作的更多信息。请记住,POST 可以在其数据中包含键/值对和/或更大、更复杂的 POST 正文。该正文可以包含 XML,例如,指定更多信息供服务器在处理请求时使用。也许是这样的:

    <image id="123">
        <resize>
            <width>200</width>
            <height>200</height>
        </resize>
    </image>
    

    这甚至可以允许在同一个请求中执行多个操作,允许用户在将它们全部提交到服务器端的单个工作单元之前尝试客户端的各种操作。当然,您将如何处理它或者它是否适用于这种情况取决于您。

    【讨论】:

      【解决方案2】:

      PUT /images/[id] 表示添加新资源或完全替换现有资源。

      POST 表示创建 (/images) 或修改资源 (/images/[id])。如果您创建资源,服务器可能会为您返回该资源。

      对于同一资源上的多个修改操作 (POST),我倾向于使用自定义标头来定义修改类型。在这种情况下你的资源

      /images/[id]/remove_redeye
      /images/[id]/crop
      /images/[id]/resize
      

      将转化为:

      POST /images/[id] HTTP/1.1
      X-RESTAction [remove_redeye|crop|resize]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-18
        • 1970-01-01
        • 2019-01-15
        • 1970-01-01
        • 2019-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多