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
对于移动部分,只要做一个复制(PUT),然后删除组合,如果你想保持简单。
这是一个公平的想法,但感觉就像在这里复制和移动工作一样;我不确定解构动作会给我带来多大的收益。 :-( – ladenedge 2010-06-22 17:49:43
要创建您通常使用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)。使用自定义移动标题删除源文件。
我更喜欢后者,因为它可以是原子的,客户端很清楚该资源已从原始集合中删除。当它获得新位置的收集时,它会在那里找到移动的资源。
对不起,我的意思是如果新文件已经驻留在系统上的另一个URL。也就是说,我不想重新上传文件。我只是想重新安置。 – ladenedge 2010-06-10 21:39:10
我们用POST发送到父容器。这似乎是新手最容易理解的方法。感谢您的想法! – ladenedge 2010-07-20 17:38:57
你应该在邮件正文中发送URL参数 – Tarion 2013-02-20 14:18:32