我正在尝试将资源从/buckets/1移到/buckets/2,这样:

初始状态

  • /buckets/1 = foo
  • /buckets/2 = HTTP 404

  • 最终状态
  • /buckets/1 = HTTP 301到/buckets/2
  • /buckets/2 = foo

  • 要求服务器以这种方式移动资源的RESTful方法是什么?

    最佳答案

    回答我自己的问题:

  • 为了便于讨论,我们假设将“球”存储在存储桶中
  • 首先要注意的是,球的生命周期不是由其容纳的铲斗决定的(将一个球从一个铲斗移动到另一个铲斗不会删除旧的球)。因此,我们应该将球提升为顶级资源:/balls
  • REST似乎在符号链接(symbolic link)方面相对于内联值而言效果最好,因此,与GET /buckets/1而不是返回存储桶中的球的值相比,让ojit_code代替它返回球的URI。

  • 然后,我们可以按以下方式移动球:
    (examine original state)
    GET /buckets/1: "balls = {'/balls/1'}"
    GET /buckets/2: "balls = {}"
    GET /balls/1: "bucket = /buckets/1"
    
    (move ball into bucket #2)
    PUT /balls/1: "bucket = /buckets/2"
    
    (examine new state)
    GET /buckets/1: "balls = {}"
    GET /buckets/2: "balls = {'/balls/1'}"
    GET /balls/1: "bucket = /buckets/2"
    

    最终结果:球在桶中移动时,球的身份保持一致,并且(最重要的是)此操作是原子性的。

    10-08 04:41