mas*_*ive 5 filesystems rest file
某些文件系统的基本操作(例如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?
迈克布朗
[...实现 cp 的首选方法包括获取资源、删除资源并使用新名称将其重新放回。]
上述方法的一个问题是缺乏原子性和一致性。由于每个操作(GET、DELETE 和 PUT)都通过 HTTP(本质上是无状态的)发生,因此服务器无法强制执行原子性。出于任何原因,客户端可能会在最后一步之前的任何步骤之后中止,这将使服务器在数据方面处于不一致的状态。
一种可能的方法:
HTTP/1.1 201 已创建
内容类型:video/x-msvideo
位置:/videos/johns_videos/8765
注意:我更喜欢发回 ID 并使用资源 ID,而不是类似的东西
位置:/videos/johns_videos/copied-2-gigabyte-video.avi
移动操作非常相似,只是服务器可以接受目标资源。例子:
http://example.com//videos/johns_videos/8765/move?destination=[目的地]
您可以扩展上述方法,以便服务器将 Last-Modified 标记发送到客户端,然后客户端将其与其请求一起发送。仅当该值仍然一致时,服务器才会执行复制/移动操作。这将解决在复制/移动操作仍在进行时更改资源的并发问题。