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
Fooestão associados a zero ou umBar. A razão pela qual eu não tratoBarcomo um sub-recurso deFooé porque a mesmaBarinstâ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 Fooinstância também estão interessados na Barinstâ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 oFooponto 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" dofooandbarrecurso. 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?
Barnão pode existir sem estar associado a a Foo. No entanto, como escrevi acima, é possível que vários Foos compartilhem o mesmo Bar. Deveria ser possível criar um Foosem um Barassociado, por isso acho que não Bardeveria ser tratado como pai.