代码之家  ›  专栏  ›  技术社区  ›  ladenedge

RESTful复制/移动操作?

  •  6
  • ladenedge  · 技术社区  · 15 年前

    首先,上传一个新的文件是使用一个放到文件的最终URL:

    PUT /folders/42/contents/<name>
    

    复制/移动想法1 :使用自定义标题放置。

    这与 S3's copy . 外观与上载相同但具有自定义标头的放置:

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

    这很好,因为在复制/移动时很容易更改文件名。然而,S3不提供move操作,可能是因为使用这个方案的move不是幂等的。

    复制/移动想法2 :发布到父文件夹。

    这与 Google Docs copy . 到目标文件夹的帖子,其中包含描述源文件的XML内容:

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

    最终,我要找的是一些易于使用和理解的东西,所以除了以上的批评,新的想法当然是受欢迎的!

    5 回复  |  直到 15 年前
        1
  •  7
  •   Darrel Miller    15 年前

    HTTP规范说如果资源已经存在,那么更新资源并返回200。


    好吧,我看错了。我更喜欢用发帖的方式而不是用父文件夹的方式。还可以使用查询字符串参数引用源文件。例如

    POST /destination/folder?sourceFile=/source/folder/filename.txt
    
        2
  •  6
  •   Tarion    13 年前

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

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

    其他人怎么说 岗位 新资源位于服务器确定的路径中。这就是拷贝在(windows)文件系统中的工作方式。假设您将一个文件复制到一个已经存在的名称,那么上面示例的响应可能是:

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

    然后通过先复制然后删除来进行移动。您不应该在一个请求中执行这两个操作。

    编辑:
    RESTful Web Services Cookbook 非常好。

    问题

    解决方案 设计可以创建副本的控制器资源。客户端向该控制器发出POST请求以复制 资源。要使POST有条件,请向 201(已创建),其位置标头包含副本的URI。

    请求 POST/albums/2009/08/1011/副本;t=a5d0e32ddfff373df1b3351e53fc6ffb1

    回应

    <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>
    
        3
  •  5
  •   deamon    15 年前

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

        4
  •  0
  •   redben    15 年前

        5
  •  0
  •   Shyam Habarakada    11 年前

    因为搬家,你可以

    b) 是的。删除带有自定义移动标题的源。

    我更喜欢后者,因为它可以是原子的,而且客户端可以清楚地看到资源已从原始集合中移除。当它获取新位置的集合时,它将在那里找到移动的资源。