假设我有资源代表图像
带路径的PUT / images / [id] - >如果已经存在更新我的资源
,将创建一个新的图像资源POST / images / [id] - >更改或更新资源例如,图像名称
DELETE / images / [id] - >这将删除我的资源
GET / images / [id] - >给我图像细节
现在的实际问题。如果我需要为图像添加其他操作,该怎么办?让我们说图像资源将响应红眼减少动作或任何其他类似的裁剪,调整大小
那么如何考虑这些行为以及如何在宁静的界面中调用它?
/图像/ [ID] / remove_redeye
/图像/ [ID] /作物
/图像/ [ID] /调整大小
上述调用在restful接口中是否有效?我对应该考虑采取什么行动感到困惑(PUT POST)?
答案 0 :(得分:6)
“删除红眼”,“裁剪”,并“调整大小”所有声音,就像“更改或更新资源”一样。它们属于PUT动作。 (我认为你在问题中混淆了PUT和POST,请参考the verbs listed at w3c。)
您如何传达行动的性质取决于所发布的内容。例如,如果我们在谈论位于数据库记录顶部的表单,则POST将仅仅是该记录的数据。没有必要指定哪些字段正在被更改,因为整个对象正在以新状态进行POST。
在这种情况下,整个对象是否处于新状态?或者该对象仅在服务器端存在,并且接口只是发送某种操作的请求?根据所提供的信息,这听起来像是后者。
在这种情况下,您可以在POST中包含有关该操作的更多信息。请记住,POST可以在其数据和/或中包含键/值对,这是一个更大,更复杂的POST正文。例如,该主体可以包含XML,为服务器指定更多信息以用于处理请求。也许是这样的:
<image id="123">
<resize>
<width>200</width>
<height>200</height>
</resize>
</image>
这甚至可以允许同一请求中的多个操作,允许用户在将它们全部提交到单个工作单元服务器端之前尝试客户端的各种操作。当然,你如何处理这个问题,或者在这种情况下是否适用,取决于你。
答案 1 :(得分: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]