10

假设我有代表图像的资源

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

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

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

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

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

那么如何考虑这些操作以及在 restful 接口中应该如何调用呢?

/images/[id]/remove_redeye

/images/[id]/crop

/images/[id]/调整大小

以上调用在restful接口中有效吗?我很困惑应该考虑这些行动(PUT POST)?

4

2 回答 2

6

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

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

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

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

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

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

于 2012-05-22T22:49:07.763 回答
1

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]
于 2012-06-13T21:44:12.890 回答