RESTful复制/移动操作?

问题描述:

我正在尝试设计一个类似RESTful的文件系统服务,而复制/移动操作正在给我带来一些麻烦。RESTful复制/移动操作?

首先,上传新文件使用一个PUT该文件的最终URL来完成:

PUT /folders/42/contents/<name> 

的问题是,如果新的文件已经在不同的URL驻留在系统上?

复制/移动理念1:与自定义标题看跌期权。

这类似于S3's copy。看起来一样的上传,但与自定义页眉认沽:

PUT /folders/42/contents/<name> 
X-custom-source: /files/5 

这是好的,因为它很容易在复制更改文件名/移动时间。但是,S3不提供移动操作,可能是因为使用此方案的举动不会是幂等的。

复制/移动思想2:POST到父文件夹。

这类似于Google Docs copy。个帖子与XML内容描述源文件的目标文件夹:

POST /folders/42/contents 
... 
<source>/files/5</source> 
<newName>foo</newName> 

我也许可以张贴到该文件的新URL更改其名称..?否则,我会在XML内容中指定一个新名称,这会放大此想法的RPC性。这也是不符合上传操作理念1.

最终我在寻找的东西,很容易使用和理解是一致的,所以除了上述的新思路批评当然欢迎!如果资源已经存在,那么你更新的资源,并返回200 如果资源不然后创建并返回存在

的HTTP规范说201

编辑:
好吧,我误解。我更喜欢POST到父文件夹的方式。您还可以使用查询字符串参数引用源文件。例如

POST /destination/folder?sourceFile=/source/folder/filename.txt 
+0

对不起,我的意思是如果新文件已经驻留在系统上的另一个URL。也就是说,我不想重新上传文件。我只是想重新安置。 – ladenedge 2010-06-10 21:39:10

+0

我们用POST发送到父容器。这似乎是新手最容易理解的方法。感谢您的想法! – ladenedge 2010-07-20 17:38:57

+0

你应该在邮件正文中发送URL参数 – Tarion 2013-02-20 14:18:32

对于移动部分,只要做一个复制(PUT),然后删除组合,如果你想保持简单。

+0

这是一个公平的想法,但感觉就像在这里复制和移动工作一样;我不确定解构动作会给我带来多大的收益。 :-( – ladenedge 2010-06-22 17:49:43

REST不限于默认的HTTP方法集。在这种情况下你可以使用WebDAV。

+0

这是一个有趣的想法!我得看看这个。 – ladenedge 2010-06-22 17:50:28

要创建您通常使用POST新的资源。这应该在服务器创建的URI上创建一个新资源。

POST /folders/42/contents/fileName 
<target>newFile</target> 

REST说什么是与POST新的资源位于服务器确定的路径。这是如何复制甚至在(Windows)文件系统中的作品。考虑一下你的文件复制到已经存在的名称,然后上面的例子中的反应可能是:

<newFileLocation>/folders/42/contents/newFile-2</newFileLocation> 

一动,然后由第一副本上进行再删除。您不应该在一个请求中执行这两个操作。

编辑:
我发现这本书RESTful Web Services Cookbook非常好。

第11章处理复制方法,并建议在11.1以下:

问题你想知道如何使现有资源的副本。

解决方案设计一个可以创建副本的控制器资源。客户端向该控制器发出POST请求以复制 资源。要使POST处于有条件,请向 客户端提供一次性URI。控制器创建副本后,使用包含副本URI的位置标题返回响应代码012(创建)。

请求 POST /专辑/ 2009/08/1011 /复制; T = a5d0e32ddff373df1b3351e53fc6ffb1

响应

<album xmlns:atom="http://www.w3.org/2005/Atom"> 
<id>urn:example:album:1014</id> 
<atom:link rel="self" href="http://www.example.org/albums/2009/08/1014"/> 
... 
</album> 

对于运动,可以

一个)。通过PUT使用自定义源标题复制,然后在源上使用DELETE。 b)。使用自定义移动标题删除源文件。

我更喜欢后者,因为它可以是原子的,客户端很清楚该资源已从原始集合中删除。当它获得新位置的收集时,它会在那里找到移动的资源。