@ray, excelente discusión
@jgerman, no olvides que solo porque es REST, no significa que los recursos tengan que ser inamovibles desde POST.
Lo que elija incluir en cualquier representación dada de un recurso depende de usted.
Su caso de las portadas a las que se hace referencia por separado es simplemente la creación de un recurso principal (cómic) cuyos recursos secundarios (portadas) pueden tener referencias cruzadas. Por ejemplo, es posible que también desee proporcionar referencias a autores, editores, personajes o categorías por separado. Es posible que desee crear estos recursos por separado o antes del cómic que los hace referencia como recursos secundarios. Alternativamente, es posible que desee crear nuevos recursos secundarios al crear el recurso primario.
Su caso específico de las portadas es un poco más complejo ya que una portada realmente requiere un cómic y viceversa.
Sin embargo, si considera un mensaje de correo electrónico como un recurso y la dirección de origen como un recurso secundario, obviamente puede hacer referencia a la dirección de origen por separado. Por ejemplo, obtenga todo de las direcciones. O cree un nuevo mensaje con una dirección anterior. Si el correo electrónico fuera REST, podría ver fácilmente que muchos recursos con referencias cruzadas podrían estar disponibles: / mensajes-recibidos, / borradores-mensajes, / de-direcciones, / a-direcciones, / direcciones, / asuntos, / archivos adjuntos, / carpetas , / tags, / categories, / labels, et al.
Este tutorial proporciona un gran ejemplo de recursos con referencias cruzadas.
http://www.peej.co.uk/articles/restfully-delicious.html
Este es el patrón más común para los datos generados automáticamente. Por ejemplo, no publica un URI, ID o fecha de creación para el nuevo recurso, ya que estos son generados por el servidor. Y, sin embargo, puede recuperar el URI, la ID o la fecha de creación cuando recupere el nuevo recurso.
Un ejemplo en su caso de datos binarios. Por ejemplo, desea publicar datos binarios como recursos secundarios. Cuando obtiene el recurso primario, puede representar esos recursos secundarios como los mismos datos binarios, o como URI que representan los datos binarios.
Los formularios y parámetros ya son diferentes a las representaciones HTML de los recursos. Publicar un parámetro binario / archivo que da como resultado una URL no es exagerado.
Cuando obtiene el formulario para un nuevo recurso (/ comic-books / new), u obtiene el formulario para editar un recurso (/ comic-books / 0 / edit), está solicitando una representación específica del formulario del recurso. Si lo publica en la colección de recursos con el tipo de contenido "application / x-www-form-urlencoded" o "multipart / form-data", está solicitando al servidor que guarde ese tipo de representación. El servidor puede responder con la representación HTML que se guardó, o lo que sea.
Es posible que también desee permitir que se publique una representación HTML, XML o JSON en la colección de recursos, para fines de una API o similar.
También es posible representar sus recursos y flujo de trabajo como lo describe, teniendo en cuenta las portadas publicadas después del cómic, pero que requieren que los cómics tengan una portada. Ejemplo como sigue.
- Permite la creación de portadas retrasadas
- Permite la creación de cómics con la portada requerida
- Permite que las cubiertas tengan referencias cruzadas
- Permite múltiples portadas
- Crear borrador de cómic
- Crear borradores de portadas de cómics
- Publicar borrador de cómic
GET / comic-books
=> 200 OK, obtenga todos los cómics.
GET / comic-books / 0
=> 200 OK, obtenga un cómic (id: 0) con portadas (/ covers / 1, / covers / 2).
GET / comic-books / 0 / covers
=> 200 OK, obtenga portadas para cómics (id: 0).
GET / covers
=> 200 OK, obtenga todas las portadas.
GET / covers / 1
=> 200 OK, obtenga cover (id: 1) con cómic (/ comic-books / 0).
GET / comic-books / new
=> 200 OK, obtenga el formulario para crear un cómic (formulario: POST / draft-comic-books).
POST / draft-comic-books
title = foo
author = boo
publisher = goo publishing
= 2011-01-01
=> 302 Encontrado, Ubicación: / draft-comic-books / 3, Redirigir al borrador de cómic (id: 3) con cubiertas (binarias).
GET / draft-comic-books / 3
=> 200 OK, obtenga un borrador de cómic (id: 3) con portadas.
GET / draft-comic-books / 3 / covers
=> 200 OK, obtenga portadas para el borrador del cómic (/ draft-comic-book / 3).
GET / draft-comic-books / 3 / covers / new
=> 200 OK, obtenga el formulario para crear la portada del borrador del cómic (/ draft-comic-book / 3) (formulario: POST / draft-comic-books / 3 / cubiertas).
POST / draft-comic-books / 3 / covers
cover_type = front
cover_data = (binary)
=> 302 Encontrado, Ubicación: / draft-comic-books / 3 / covers, Redirigir a una nueva portada para el borrador del cómic (/ draft-comic -book / 3 / covers / 1).
GET / draft-comic-books / 3 / publishing
=> 200 OK, obtenga el formulario para publicar el borrador del cómic (id: 3) (formulario: POST / updated-comic-books).
POST / updated-comic-books
title = foo
author = boo
publisher = goo
publishing
= 2011-01-01
cover_type = front
cover_data = (binary)
=> 302 Encontrado, Ubicación: / comic-books / 3, Redirigir al cómic publicado (id: 3) con tapas.