Как переместить ресурс REST? - PullRequest
9 голосов
/ 05 апреля 2011

Я пытаюсь переместить ресурс с /buckets/1 на /buckets/2 так, чтобы:

Исходное состояние

  • / ведра / 1 = foo
  • / buckets / 2 = HTTP 404

Конечное состояние

  • / ведра / 1 = HTTP 301 к / ведра / 2
  • / ведра / 2 = foo

Что такое RESTful способ попросить сервер переместить ресурс таким способом?

Ответы [ 3 ]

11 голосов
/ 06 апреля 2011

Отвечая на мой вопрос:

  • Ради этого обсуждения давайте предположим, что мы храним "шары" в ведрах
  • Первое, на что следует обратить внимание, это то, что жизненный цикл шара не определяется его содержащим ведром (перемещение шара из одного ведра в другое не удаляет старый шар). Поэтому мы должны продвигать шары на ресурс верхнего уровня: /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"

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

4 голосов
/ 05 апреля 2011
  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 голос
/ 11 мая 2016
  1. PUT / ведра / 1

  2. POST / ход-ведро? От = 1 & до = 2

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

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

...