@ray, excelente discussão
@jgerman, não se esqueça que só porque é REST, não significa que os recursos precisam ser fixados em pedra no POST.
O que você escolher incluir em qualquer representação de um recurso é com você.
Seu caso das capas referenciadas separadamente é apenas a criação de um recurso pai (história em quadrinhos) cujos recursos filho (capas) podem ter referências cruzadas. Por exemplo, você também pode fornecer referências a autores, editores, caracteres ou categorias separadamente. Você pode criar esses recursos separadamente ou antes da revista em quadrinhos que os referencia como recursos filho. Como alternativa, você pode criar novos recursos filho após a criação do recurso pai.
Seu caso específico das capas é um pouco mais complexo, pois uma capa realmente exige uma história em quadrinhos e vice-versa.
No entanto, se você considerar uma mensagem de email como um recurso e o endereço de origem como um recurso filho, obviamente ainda poderá referenciar o endereço de origem separadamente. Por exemplo, obtenha tudo dos endereços. Ou crie uma nova mensagem com um endereço anterior. Se o email fosse REST, você poderia ver facilmente que muitos recursos de referência cruzada estavam disponíveis: / mensagens recebidas, / mensagens de rascunho, / de endereços, / para endereços, / endereços, assuntos / anexos / pastas , / tags, / categorias, / etiquetas, et al.
Este tutorial fornece um ótimo exemplo de recursos com referência cruzada.
http://www.peej.co.uk/articles/restfully-delicious.html
Esse é o padrão mais comum para dados gerados automaticamente. Por exemplo, você não publica um URI, ID ou data de criação para o novo recurso, pois eles são gerados pelo servidor. E, no entanto, você pode recuperar o URI, o ID ou a data de criação quando recuperar o novo recurso.
Um exemplo no seu caso de dados binários. Por exemplo, você deseja postar dados binários como recursos filho. Quando você obtém o recurso pai, pode representar esses recursos filhos como os mesmos dados binários ou como URIs que representam os dados binários.
Formulários e parâmetros já são diferentes das representações HTML dos recursos. A publicação de um parâmetro binário / arquivo que resulta em um URL não é um exagero.
Quando você obtém o formulário para um novo recurso (/ histórias em quadrinhos / novo) ou obtém o formulário para editar um recurso (/ histórias em quadrinhos / 0 / edição), solicita uma representação específica do formulário. Se você publicá-lo na coleção de recursos com o tipo de conteúdo "application / x-www-form-urlencoded" ou "multipart / form-data", você está solicitando ao servidor que salve essa representação de tipo. O servidor pode responder com a representação HTML que foi salva ou o que seja.
Você também pode permitir que uma representação HTML, XML ou JSON seja postada na coleção de recursos, para fins de uma API ou similar.
Também é possível representar seus recursos e fluxo de trabalho conforme você descreve, levando em consideração as capas publicadas após a história em quadrinhos, mas exigindo que as histórias em quadrinhos tenham uma capa. Exemplo da seguinte maneira.
- Permite criação de capa atrasada
- Permite a criação de histórias em quadrinhos com a capa necessária
- Permite que as capas sejam cruzadas
- Permite várias capas
- Criar rascunho de quadrinhos
- Criar rascunhos de capas de quadrinhos
- Publicar rascunho de quadrinhos
GET / histórias em quadrinhos
=> 200 OK, obtenha todas as histórias em quadrinhos.
GET / comic-books / 0
=> 200 OK, Obter gibi (id: 0) com capas (/ capas / 1, / capas / 2).
GET / histórias em quadrinhos / 0 / capas
=> 200 OK, obtenha capas para histórias em quadrinhos (id: 0).
GET / covers
=> 200 OK, obtenha todas as capas.
GET / covers / 1
=> 200 OK, Obter capa (id: 1) com histórias em quadrinhos (/ comic-books / 0).
GET / comic-books / new
=> 200 OK, Obter formulário para criar quadrinhos (formulário: POST / draft-comic-books).
POST / draft-comic-books
title = foo
author = boo
publisher = goo
publicado = 2011-01-01
=> 302 Encontrados, Localização: / draft-comic-books / 3, Redirecionar para rascunho de quadrinhos (id: 3) com capas (binárias).
GET / draft-comic-books / 3
=> 200 OK, obtenha rascunho de quadrinhos (id: 3) com capas.
GET / draft-comic-books / 3 / covers
=> 200 OK, obtenha capas para rascunho de quadrinhos (/ draft-comic-book / 3).
GET / draft-comic-books / 3 / covers / new
=> 200 OK, Obter formulário para criar uma capa para rascunho de quadrinhos (/ draft-comic-book / 3) (formulário: POST / draft-comic-books / 3 / capas).
POST / draft-comic-books / 3 / covers
cover_type = front
cover_data = (binary)
=> 302 Encontrado, Localização: / draft-comic-books / 3 / covers, Redirecionar para nova capa para rascunho de quadrinhos (/ draft-comic - livro / 3 / capas / 1).
GET / draft-comic-books / 3 / publish
=> 200 OK, Obter formulário para publicar o rascunho da revista em quadrinhos (id: 3) (formulário: POST / publicado-histórias em quadrinhos).
POST / comic-comic-
title title = foo
autor = boo
publisher = goo
publicado =
01-01-2011 cover_type = front
cover_data = (binário)
=> 302 Encontrado, Localização: / comic-books / 3, Redirecionar para publicação em quadrinhos (id: 3) com capas.