我正在尝试设计一个类似 RESTful 文件系统的服务,复制/移动操作给我带来了一些麻烦。
首先,上传新文件是使用 PUT 到文件的最终 URL 来完成的:
PUT /folders/42/contents/<name>
问题是,如果新文件已驻留在系统上的不同 URL 下怎么办?
复制/移动想法 1:带有自定义标头的 PUT。
这类似于S3的副本。 PUT 看起来与上传相同,但具有自定义标头:
PUT /folders/42/contents/<name>
X-custom-source: /files/5
这很好,因为在复制/移动时很容易更改文件名。但是,S3 不提供移动操作,可能是因为使用此方案的移动不是幂等的。
复制/移动想法 2:POST 到父文件夹。
这类似于谷歌文档副本。 POST 到目标文件夹,其中包含描述源文件的 XML 内容:
POST /folders/42/contents
...
<source>/files/5</source>
<newName>foo</newName>
我也许可以 POST 到文件的新 URL 来更改其名称..?否则,我将不得不在 XML 内容中指定一个新名称,这会增强此想法的 RPC 性。也不像想法1那样符合上传操作。
最终,我正在寻找易于使用和理解的东西,因此除了对上述内容的批评之外,当然也欢迎新的想法!