如何使用REST建模文件系统操作?

mas*_*ive 5 filesystems rest file

某些文件系统的基本操作(例如lsrm)有明显的对应关系,但是如何实现不直接的RESTful操作,如cpmv

作为问题的答案如何在REST中实现资源的复制粘贴?建议,首选的实现cp方式包括获取资源,删除它并使用新名称再次将其恢复.

但如果我需要有效地做呢?例如,如果资源的规模很大?如何消除资源有效负载到客户端和返回原始服务器的多余传输?

这是一个例子.我有一个资源:

/videos/my_videos/2-gigabyte-video.avi

我想将它复制到一个新资源:

/videos/johns_videos/copied-2-gigabyte-video.avi

我如何以RESTful方式实现复制,移动或其他文件系统操作?还是有正确的方法?我做错了吗?

Mic*_*own 5

我不相信任何给定的答案都是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]
Run Code Online (Sandbox Code Playgroud)

将内容放在(/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]
Run Code Online (Sandbox Code Playgroud)

为什么这个RESTful?

  • 不附加"移动"或"复制"到URI(这是RPC)
  • 它使用PUT(POST是附加到集合,目标URI不完全知道)
  • 它不使用RPC而非REST发送的"命令"(例如XML指令).
  • 不了解下划线存储 - 客户端不关心硬/软链接或写时复制优化,也不应该知道它们.

迈克布朗


Sur*_*apu 3

[...实现 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 标记发送到客户端,然后客户端将其与其请求一起发送。仅当该值仍然一致时,服务器才会执行复制/移动操作。这将解决在复制/移动操作仍在进行时更改资源的并发问题。