Estou no processo de criação de uma API REST e, atualmente, estou encontrando o seguinte problema:
Foo
é o primeiro recurso. As operações CRUD podem ser aplicadas via/foo/
URI.Bar
é o segundo recurso. As operações CRUD podem ser aplicadas via/bar/
URI.- Todos
Foo
estão associados a zero ou umBar
. A razão pela qual eu não tratoBar
como um sub-recurso deFoo
é porque a mesmaBar
instância pode ser compartilhada entre váriosFoo
. Por isso, achei melhor acessá-lo por meio de um URI independente em vez de/foo/[id]/bar
.
Meu problema é que, em uma quantidade significativa de casos, os clientes que solicitam uma Foo
instância também estão interessados na Bar
instância associada . Atualmente, isso significa que eles precisam executar duas consultas em vez de uma. Quero apresentar uma maneira que permita obter os dois objetos com uma única consulta, mas não sei como modelar a API para fazer isso. O que eu vim até agora:
- Eu poderia introduzir um parâmetro de consulta semelhante a este:
/foo/[id]?include_bar=true
. O problema dessa abordagem é que a representação do recurso (por exemplo, a estrutura JSON) da resposta precisaria parecer diferente (por exemplo, um contêiner, como em{ foo: ..., bar: ... }
vez de apenas um serializadoFoo
), o que torna oFoo
ponto final do recurso "heterogêneo". Eu não acho isso bom. Ao consultar/foo
, os clientes sempre devem obter a mesma representação de recurso (estrutura), independentemente dos parâmetros de consulta. - Outra idéia é introduzir um novo ponto de extremidade somente leitura, por exemplo
/fooandbar/[foo-id]
. Nesse caso, não há problema em retornar uma representação como{ foo: ..., bar: ... }
, porque é apenas a representação "oficial" dofooandbar
recurso. No entanto, não sei se esse ponto de extremidade auxiliar é realmente RESTful (foi por isso que escrevi "can" no título da pergunta. É claro que é tecnicamente possível, mas não sei se é uma boa idéia).
O que você acha? há outras possibilidades?
Bar
não pode existir sem estar associado a a Foo
. No entanto, como escrevi acima, é possível que vários Foo
s compartilhem o mesmo Bar
. Deveria ser possível criar um Foo
sem um Bar
associado, por isso acho que não Bar
deveria ser tratado como pai.