Как переместить ресурс REST?
Я пытаюсь переместить ресурс из /buckets/1
в /buckets/2
такой что:
Начальное состояние
- / buckets / 1 = foo
- / buckets / 2 = HTTP 404
Конечное состояние
- /buckets/1 = HTTP 301 для / buckets / 2
- / buckets / 2 = foo
Какой RESTful способ попросить сервер переместить ресурс таким способом?
3 ответа
Отвечая на мой собственный вопрос:
- Ради этого обсуждения давайте предположим, что мы храним "шары" в ведрах
- Первое, на что следует обратить внимание, это то, что жизненный цикл шара не определяется его содержащим ведром (перемещение шара из одного ведра в другое не удаляет старый шар). Поэтому мы должны продвигать шары на ресурс верхнего уровня:
/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"
Конечный результат: идентичность шара остается неизменной, когда он перемещается через ведра, и (что наиболее важно) эта операция является атомарной.
GET /buckets/1
DELETE /buckets/1
PUT /buckets/2 {data returned by #1}
Это не делает сервер 301
, хоть. Альтернативой было бы использовать WebDAV MOVE
метод, т. е. путем создания собственного @MOVE
аннотация с использованием @HttpMethod
аннотация:
import ...;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("MOVE")
public @interface MOVE {}
но это нарушает архитектурный принцип REST, заключающийся в использовании HTTP как единого интерфейса ( RESTful Java).
PUT / ведра / 1
POST / move-bucket? От =1& до = 2
GET / ведра / 1 HTTP 301
GET / ведра /2 HTTP 200