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