Как переместить ресурс 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"

Конечный результат: идентичность шара остается неизменной, когда он перемещается через ведра, и (что наиболее важно) эта операция является атомарной.

  1. GET /buckets/1
  2. DELETE /buckets/1
  3. 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).

  1. PUT / ведра / 1

  2. POST / move-bucket? От =1& до = 2

  3. GET / ведра / 1 HTTP 301

  4. GET / ведра /2 HTTP 200

Другие вопросы по тегам