@ray, відмінна дискусія
@jgerman, не забувайте, що те, що це REST, не означає, що ресурси повинні бути встановлені в камені від POST.
Що ви вирішите включити в будь-яке подання ресурсу, залежить від вас.
Ваш випадок обкладок, на які посилається окремо, - це лише створення батьківського ресурсу (коміксу), на дочірні ресурси (обкладинки) може бути перехресне посилання. Наприклад, ви також можете окремо надати посилання на авторів, видавців, персонажів або категорій. Ви можете створити ці ресурси окремо або перед коміксом, який називає їх дочірніми ресурсами. Крім того, ви можете створити нові дочірні ресурси після створення батьківського ресурсу.
Ваш конкретний випадок обкладинок трохи складніший, оскільки обкладинка дійсно вимагає коміксу, і навпаки.
Однак якщо ви розглядаєте повідомлення електронної пошти як ресурс, а адресу - як дочірній ресурс, очевидно, ви все одно можете посилатися на адресу окремо. Наприклад, отримати все з адрес. Або створити нове повідомлення з попереднім адресою. Якщо електронна пошта була REST, ви можете легко побачити, що багато перехресних посилань можуть бути доступні: / отримані повідомлення, / чернетні повідомлення, / з адрес, / на адреси, / адреси, / теми, / вкладення, / папки , / теги, / категорії, / мітки та ін.
Цей підручник дає чудовий приклад перехресних посилань на ресурси.
http://www.peej.co.uk/articles/restrely-delicious.html
Це найпоширеніший шаблон для автоматично генерованих даних. Наприклад, ви не публікуєте URI, ID або дату створення нового ресурсу, оскільки вони генеруються сервером. І все ж ви можете отримати URI, ідентифікатор або дату створення, коли повернете новий ресурс.
Приклад у вашому випадку двійкових даних. Наприклад, ви хочете розміщувати двійкові дані як дочірні ресурси. Коли ви отримуєте батьківський ресурс, ви можете представляти ці дочірні ресурси як ті самі бінарні дані, або як URI, які представляють двійкові дані.
Форми та параметри вже відрізняються, ніж HTML-представлення ресурсів. Опублікування бінарного / параметра параметра, що призводить до отримання URL-адреси, не є розтяжкою.
Коли ви отримуєте форму для нового ресурсу (/ коміксів / новий) або отримуєте форму для редагування ресурсу (/ коміксів / 0 / редагування), ви запитуєте представлення ресурсу для конкретних форм. Якщо ви розмістите його в колекції ресурсів із вмістом типу "application / x-www-form-urlencoded" або "multipart / form-data", ви просите сервер зберегти представлення цього типу. Сервер може відповісти збереженим представленням HTML або будь-яким іншим.
Ви також можете дозволити представлення HTML, XML або JSON в колекцію ресурсів для цілей API чи подібних.
Можна також представляти свої ресурси та робочий процес так, як ви описуєте, враховуючи обкладинки, розміщені після коміксу, але вимагаючи, щоб комікси мали обкладинку. Приклад наступний.
- Дозволяє затримувати створення обкладинки
- Дозволяє створювати комікси з необхідною обкладинкою
- Дозволяє перехресне посилання на обкладинки
- Дозволяє декілька обкладинок
- Створіть проект коміксу
- Створіть обкладинки проектів коміксів
- Опублікувати проект коміксу
GET / comic-books
=> 200 ОК, отримуйте всі комікси.
GET / comic-books / 0
=> 200 ОК, дістаньте комікс (id: 0) із обкладинками (/ обкладинки / 1, / обкладинки / 2).
GET / comic-books / 0 / обкладинки
=> 200 ОК, отримайте обкладинки для коміксів (id: 0).
GET / cover
=> 200 ОК, дістаньте всі обкладинки.
GET / обкладинки / 1
=> 200 ОК, дістаньте обкладинку (id: 1) із коміксів (/ коміксів / 0).
GET / comic-books / new
=> 200 ОК, Отримайте форму для створення коміксу (форма: POST / чернетка-комікс).
POST / draft-comic-books
title = foo
author = boo
publisher = goo
published = 2011-01-01
=> 302 Знайдено, Розташування: / draft-comic-books / 3, Перенаправлення на проект коміксу (id: 3) з обкладинки (двійкові).
GET / чернетки-комікси / 3
=> 200 ОК, дістаньте проект коміксу (id: 3) із обкладинками.
GET / чернетки-комікси / 3 / обкладинки
=> 200 ОК, отримати обкладинки для проекту коміксів (/ чернетка-комікс / 3).
GET / чернетки-комікси / 3 / обкладинки / нові
=> 200 ОК, Отримайте форму для створення обкладинки для проекту коміксу (/ чернетка-комікс / 3) (форма: POST / чернетка-комікс / 3 / обкладинки).
POST / чернетки-комікси / 3 / обкладинки
cover_type = передня
обкладинка_дані = (двійкові)
=> 302 Знайдено, Розташування: / чернетки-комікси / 3 / обкладинки, Перенаправлення на нову обкладинку для проекту коміксу (/ проект-комікс -книга / 3 / обкладинки / 1).
GET / чернетки-комікси / 3 / публікація
=> 200 ОК, Отримайте форму для публікації проекту коміксів (id: 3) (форма: POST / published-comic-books).
POST / published-comic-books
title = foo
author = boo
publisher = goo
published = 2011-01-01
cover_type = front
cover_data = (binary)
=> 302 Знайдено, Розташування: / comic-books / 3, Перенаправлення на опублікований комікс (id: 3) з обкладинками.