Estoy en el proceso de crear una API REST y actualmente encuentro el siguiente problema:
Foo
Es el primer recurso. Las operaciones CRUD se pueden aplicar a través del/foo/
URI.Bar
Es el segundo recurso. Las operaciones CRUD se pueden aplicar a través del/bar/
URI.- Todos
Foo
están asociados con cero o unoBar
. La razón por la que no tratoBar
como un subrecursoFoo
es porque la mismaBar
instancia se puede compartir entre variosFoo
. Así que pensé que es mejor acceder a él a través de un URI independiente en lugar de hacerlo/foo/[id]/bar
.
Mi problema es que en una cantidad significativa de casos, los clientes que solicitan una Foo
instancia también están interesados en la Bar
instancia asociada . Actualmente, esto significa que tienen que realizar dos consultas en lugar de una. Quiero presentar una forma que permita obtener ambos objetos con una sola consulta, pero no sé cómo modelar la API para hacerlo. Lo que se me ocurrió hasta ahora:
- Podría introducir un parámetro de consulta similar a esto:
/foo/[id]?include_bar=true
. El problema con este enfoque es que la representación de recursos (p. Ej., La estructura JSON) de la respuesta necesitaría verse diferente (p. Ej., Un contenedor como en{ foo: ..., bar: ... }
lugar de solo un serializadoFoo
), lo que hace que elFoo
punto final del recurso sea "heterogéneo". No creo que sea algo bueno. Al realizar consultas/foo
, los clientes siempre deben obtener la misma representación de recursos (estructura), independientemente de los parámetros de consulta. - Otra idea es introducir un nuevo punto final de solo lectura, por ejemplo
/fooandbar/[foo-id]
. En este caso, no es problema devolver una representación como{ foo: ..., bar: ... }
, porque entonces es solo la representación "oficial" delfooandbar
recurso. Sin embargo, no sé si ese punto final auxiliar es realmente RESTful (es por eso que escribí "can" en el título de la pregunta. Por supuesto, es técnicamente posible, pero no sé si es una buena idea).
¿Qué piensas? existen algunas otras posibilidades?
Bar
no puede existir sin estar asociado a a Foo
. Sin embargo, como escribí anteriormente, es posible que múltiples Foo
correos compartan lo mismo Bar
. Debería ser posible crear un Foo
sin un Bar
asociado, por lo que no creo Bar
que deba tratarse como padre.