I'm trying to move a resource from /buckets/1
to /buckets/2
such that:
Initial state
- /buckets/1 = foo
- /buckets/2 = HTTP 404
Final state
- /buckets/1 = HTTP 301 to /buckets/2
- /buckets/2 = foo
What's a RESTful way of asking the server to move a resource in this manner?
Answering my own question:
/balls
GET /buckets/1
returning the value of the ball in the bucket let's have it return the URI of the ball instead.We can then move balls as follows:
End-result: the ball's identity remains consistent as it moves across buckets and (most importantly) this operation is atomic.
Create original resource:
PUT /bucket/1
Call server procedure that responsible for moving resources:
POST /bucket/1/move-to/2
Original resource path now should return Moved status code:
GET /bucket/1 HTTP 301
Resource now should be available on new path:
GET /bucket/2 HTTP 200
GET /buckets/1
DELETE /buckets/1
PUT /buckets/2 {data returned by #1}
That doesn't make the server
301
, though. The alternative would be to use the WebDAVMOVE
method, i.e. by creating your own@MOVE
annotation using the@HttpMethod
annotation:but doing so breaks REST's architectural principle of using HTTP as a uniform interface (RESTful Java).