我正在尝试将资源从/buckets/1
移至/buckets/2
,以便:
要求服务器以这种方式移动资源的RESTful方法是什么?
答案 0 :(得分:11)
回答我自己的问题:
/balls
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)
GET /buckets/1
DELETE /buckets/1
PUT /buckets/2 {data returned by #1}
但这不会使服务器301
成为可能。另一种方法是使用WebDAV MOVE
method,即使用@MOVE
注释创建自己的@HttpMethod
注释:
import ...;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("MOVE")
public @interface MOVE {}
但这样做违反了REST使用HTTP作为统一接口(RESTful Java)的架构原则。
答案 2 :(得分:1)
PUT / buckets / 1
POST / move-bucket?from = 1& to = 2
GET / buckets / 1 HTTP 301
GET / buckets / 2 HTTP 200