我不相信任何给定的答案是RESTful。这是我会做的。
用于复印:
PUT /videos/johns_videos/copied-2-gigabyte-video.avi
HOST: www.server.com
Content-Location: /videos/johns_videos/2-gigabyte-video.avi
[empty-body]
把内容的在位置(/videos/johns_videos/2-gigabyte-video.avi)在(/videos/johns_videos/copied-2-gigabyte-video.avi) 。
移动将是一个带有删除的副本,为了检查副本和删除之间的一致性,您将需要使用在PUT的响应中给出的修订号。
PUT /videos/johns_videos/copied-2-gigabyte-video.avi
HOST: www.server.com
Content-Location: /videos/johns_videos/2-gigabyte-video.avi
[empty-body]
201 Created
ETag: "3e32f5a1123afb12" (an md5 of the file)
Location: /videos/johns_videos/copied-2-gigabyte-video.avi
[empty-body]
DELETE /videos/johns_videos/2-gigabyte-video.avi
HOST: www.server.com
If-Match: "3e32f5a1123afb12"
[empty-body]
204 No Content
[empty-body]
为什么这个RESTful?
- 不追加“移动”或“复制”到URI(这是RPC)
- 它使用PUT(POST是追加到集合,目标URI尚不完全清楚)
- 它不使用RPC(而不是REST)发送的“命令”(例如XML指令)。
- 不理解下划线存储 - 客户端不关心硬/软链接或写入副本优化,也不应该了解它们。
迈克·布朗
我喜欢你的方法 - 我会看看我是否可以使用Webdav。在另一种方法中,URL/video/my_videos/[video_id]/copy中的名为copy的资源不会将操作编码到与REST原则相反的URL中吗? – massive 2010-05-19 07:41:41
@massive - 1.当然看看WebDAV是否适用于这种情况(我认为这是定制的) 2.作为资源复制/移动不违反任何REST原则。将资源仅仅视为“事物”或领域对象只会在一定程度上带我们。为了更实际的目的,您需要将处理功能作为资源(例如:计算保费,两个银行账户之间的转账金额等)。 这是一个在RESTful Web Services Cookbook(O'reilly)中讨论得很好的模式。如果您有任何疑问,我很乐意进一步讨论。 – 2010-05-19 12:11:12
我在这里看不到很多RESTful(也许没关系)。没有涉及的超媒体(没有链接要遵循),你需要带外信息才能知道../copy URI甚至存在。 – Gandalf 2010-05-19 15:42:19