如何移动REST资源?

Gil*_*ili 9 rest

我正在尝试将资源从以下/buckets/1方式移动到/buckets/2:

初始状态

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

最终状态

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

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

Gil*_*ili 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"
Run Code Online (Sandbox Code Playgroud)

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

  • 我喜欢你的回答,但我不明白你提到的原子性。在我看来,您有两个要求。在这两个请求之间,世界不会处于一种奇怪的状态吗?(球位于 2 个桶中,这不是您真正想要的状态)。 (2认同)