某些文件系统的基本操作(例如ls
和rm
)有明显的对应关系,但是如何实现不直接的RESTful操作,如cp
或mv
?
作为问题的答案如何在REST中实现资源的复制粘贴?建议,首选的实现cp
方式包括获取资源,删除它并使用新名称再次将其恢复.
但如果我需要有效地做呢?例如,如果资源的规模很大?如何消除资源有效负载到客户端和返回原始服务器的多余传输?
这是一个例子.我有一个资源:
/videos/my_videos/2-gigabyte-video.avi
我想将它复制到一个新资源:
/videos/johns_videos/copied-2-gigabyte-video.avi
我如何以RESTful方式实现复制,移动或其他文件系统操作?还是有正确的方法?我做错了吗?
我不相信任何给定的答案都是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指令).
不了解下划线存储 - 客户端不关心硬/软链接或写时复制优化,也不应该知道它们.
迈克布朗