@ray, отличная дискуссия
@jgerman, не забывайте, что только потому, что это REST, не означает, что ресурсы должны быть установлены в камне из POST.
То, что вы решите включить в любое представление ресурса, зависит от вас.
Ваш случай обложек, на которые ссылаются отдельно, является просто созданием родительского ресурса (комикса), чьи дочерние ресурсы (обложки) могут иметь перекрестные ссылки. Например, вы также можете указать ссылки на авторов, издателей, персонажей или категории по отдельности. Вы можете создать эти ресурсы отдельно или перед комиксами, которые ссылаются на них как на дочерние ресурсы. В качестве альтернативы вы можете создать новые дочерние ресурсы при создании родительского ресурса.
Ваш конкретный случай обложек немного сложнее, поскольку обложка действительно требует комиксов, и наоборот.
Однако, если вы рассматриваете сообщение электронной почты как ресурс, а адрес отправителя - как дочерний ресурс, очевидно, что вы все равно можете ссылаться на адрес отправителя отдельно. Например, получить все по адресам. Или создайте новое сообщение с предыдущим адресом от. Если бы электронная почта была REST, вы могли легко увидеть, что многие перекрестные ссылки могут быть доступны: / полученные-сообщения, / черновые сообщения, / от-адреса, / на адреса, / адреса, / темы, / вложения, / папки , / теги, / категории, / ярлыки, и др.
Этот учебник представляет собой отличный пример перекрестных ссылок ресурсов.
http://www.peej.co.uk/articles/restfully-delicious.html
Это наиболее распространенный шаблон для автоматически генерируемых данных. Например, вы не публикуете URI, ID или дату создания для нового ресурса, так как они генерируются сервером. И все же вы можете получить URI, ID или дату создания, когда получите новый ресурс обратно.
Пример в вашем случае двоичных данных. Например, вы хотите опубликовать двоичные данные как дочерние ресурсы. Когда вы получите родительский ресурс, вы можете представить эти дочерние ресурсы как те же двоичные данные или как URI, которые представляют двоичные данные.
Формы и параметры уже отличаются от представлений ресурсов в HTML. Публикация бинарного / файлового параметра, который приводит к URL, не растягивается.
Когда вы получаете форму для нового ресурса (/ comic-books / new) или получаете форму для редактирования ресурса (/ comic-books / 0 / edit), вы запрашиваете специфичное для формы представление ресурса. Если вы публикуете его в коллекции ресурсов с типом контента «application / x-www-form-urlencoded» или «multipart / form-data», вы просите сервер сохранить это представление типа. Сервер может ответить сохраненным представлением HTML или чем-то еще.
Вы также можете разрешить размещение представления HTML, XML или JSON в коллекции ресурсов для целей API или аналогичного.
Вы также можете представить свои ресурсы и рабочий процесс так, как вы их описали, принимая во внимание обложки, опубликованные после комиксов, но требующие обложек комиксов. Пример следующим образом.
- Позволяет отложить создание обложки
- Позволяет создавать комиксы с необходимой обложкой
- Позволяет перекрестные ссылки на обложки
- Позволяет несколько обложек
- Создать черновик комиксов
- Создавать черновики обложек комиксов
- Опубликовать черновик комиксов
ПОЛУЧИТЬ / комиксы
=> 200 ОК, получить все комиксы.
GET / comic-books / 0
=> 200 OK, получить комикс (id: 0) с обложками (/ cover / 1, / cover / 2).
GET / comic-books / 0 / cover
=> 200 OK, Получить обложки для комиксов (id: 0).
ПОЛУЧИТЬ / обложки
=> 200 ОК, получить все обложки.
GET / cover / 1
=> 200 OK, Получить обложку (id: 1) с комиксами (/ comic-books / 0).
GET / comic-books / new
=> 200 ОК, получить форму для создания комиксов (форма: POST / draft-comic-books).
POST / draft-comic-books
title = foo
author = boo
publisher = goo
опубликовано = 2011-01-01
=> 302 Найдено, Местоположение: / draft-comic-books / 3, Перенаправить на черновик комиксов (id: 3) с обложки (двоичные).
GET / draft-comic-books / 3
=> 200 OK, получите черновик комиксов (id: 3) с обложками.
GET / draft-comic-books / 3 / cover
=> 200 OK, Получить обложки для черновика комиксов (/ draft-comic-book / 3).
GET / draft-comic-books / 3 / cover / new
=> 200 ОК, Получить форму для создания обложки для черновика комиксов (/ draft-comic-book / 3) (форма: POST / draft-comic-books / 3 / крышки).
POST / draft-comic-books / 3 / cover
cover_type = front
cover_data = (binary)
=> 302 Найдено, Местоположение: / draft-comic-books / 3 / cover, Перенаправить на новую обложку для черновика комиксов (/ draft-comic -book / 3 / обложки / 1).
GET / draft-comic-books / 3 / publish
=> 200 OK, получите форму для публикации черновика комиксов (id: 3) (форма: POST / Опубликованные комиксы).
POST / опубликованные комиксы
title = foo
author = boo
publisher = goo
опубликовано = 2011-01-01
cover_type = front
cover_data = (двоичный файл)
=> 302 найдено, расположение: / comic-books / 3, перенаправить на опубликованный комикс (id: 3) с крышками.