如何移动REST资源?

时间:2011-04-05 17:05:22

标签: rest

我正在尝试将资源从/buckets/1移至/buckets/2,以便:

初始状态

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

最终状态

  • / buckets / 1 = HTTP 301 to / buckets / 2
  • / buckets / 2 = foo

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

3 个答案:

答案 0 :(得分:11)

回答我自己的问题:

  • 为了便于讨论,我们假设我们将“球”存储在桶中
  • 首先要注意的是球的生命周期不是由其包含的铲斗决定的(将球从一个球桶移动到另一个球桶不会删除旧球)。因此,我们应该将球推广到顶级资源:/balls
  • REST似乎在符号链接方面效果最好而不是内联值,所以不是GET /buckets/1返回存储桶中球的值而是让它返回球的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"

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

答案 1 :(得分:4)

  1. GET /buckets/1
  2. DELETE /buckets/1
  3. PUT /buckets/2 {data returned by #1}
  4. 但这不会使服务器301成为可能。另一种方法是使用WebDAV MOVE method,即使用@MOVE注释创建自己的@HttpMethod注释:

    import ...;
    
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @HttpMethod("MOVE")
    public @interface MOVE {}
    

    但这样做违反了REST使用HTTP作为统一接口(RESTful Java)的架构原则。

答案 2 :(得分:1)

  1. PUT / buckets / 1

  2. POST / move-bucket?from = 1& to = 2

  3. GET / buckets / 1 HTTP 301

  4. GET / buckets / 2 HTTP 200