2014-11-21 1 views
2

У меня есть слайд-шоу. Каждое слайд-шоу состоит из слайдов.Операции в API «RESTful»

Ниже будет возвращать список упорядоченных слайдов в слайд-шоу:

GET api/slideshows/123/slides:

{ 
    { 
     slideId : "22", 
     name : "My slide" 
    }, 
    { 
     slideId : "25", 
     name : "My second slide" 
    }, 
    { 
     slideId : "26", 
     name : "Another slide" 
    } 
} 

Я хочу выполнить следующую операцию, например:

Переместить слайд 26 в положение после скольжения 22

Что такое хороший способ разоблачить такой запрос?

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

PUT api/slideshows/123/slides 

Другой вариант поставить moveAfter «операцию»:

POST api/slideshows/123/slides/26?action=moveAfter 
body: 
{ 
    referenceId : "22" 
} 

Я понимаю, что это не совсем RESTful, но существуют какие другие практические решения?

ответ

1

Я бы сделал что-то вроде этого: PUT api/slideshows/123/slides/26/position 22.

КПП. это интересно. Вы можете сделать это 2 способами:

  • каждый слайд имеет уникальный идентификатор, который не зависит от порядка
  • идентификатор является таким же, как индекс порядка (или положение) - в этом случае вы должны обновлять всю коллекцию после каждого шага, потому что сервер поддерживает состояние ресурса, а не клиент, поэтому он будет намного медленнее.
+0

Вложения URI настолько глубоко могут быть проблематичными. Лучше идти с плоской структурой и представлять ассоциации ресурсов через контент в ресурсах, а не в своих URI. –

1

Я бы пошел со следующим дизайном.

  • Ключевым моментом здесь является то, что слайды для слайд-шоу просто массив URI, указывающий на учредительными слайд ресурсов. Чтобы изменить порядок, добавить или удалить слайды из слайд-шоу, вы PATCH ресурс слайд-шоу с новым массивом слайдов.

  • Создание слайда выполняется независимо от слайд-шоу, которое ссылается на него. Связи между слайд-шоу и слайдами могут быть изменены только с помощью PATCH на ресурсе слайд-шоу.

  • Ресурсы URI не гнездятся глубоко. Это плохой выбор дизайна, который может снова укусить вас.

Я иллюстрирую его серией пар запроса-ответа.

GET /slideshows/17 
200 OK 
{ 
    "slideshow_id": 17, 
    "slides": [ 
     "/slides/15", 
     "/slides/42", 
     "/slides/76", 
     "/slides/31" 
    ] 
} 

POST /slides 
{ 
    "content": "..." 
} 
201 Created 
Location: /slides/93 

GET /slides/93 
200 OK 
{ 
    "slide_id": 93, 
    "slideshow_association": null, 
    "content": "..." 
} 

PATCH /slideshows/17 
{ 
    "slides": [ 
     "/slides/15", 
     "/slides/31" 
     "/slides/42", 
     "/slides/76", 
     "/slides/93" 
    ] 
} 
204 No Content 

GET /slides/93 
200 OK 
{ 
    "slide_id": 93, 
    "slideshow_association": { 
     "slideshow": "/slideshows/17", 
     "index": 4, 
     "previous_slide": "/slides/76", 
     "next_slide": null 
    }, 
    "content": "..." 
}