Estoy en el proceso de crear una API REST y actualmente encuentro el siguiente problema:
FooEs el primer recurso. Las operaciones CRUD se pueden aplicar a través del/foo/URI.BarEs el segundo recurso. Las operaciones CRUD se pueden aplicar a través del/bar/URI.- Todos
Fooestán asociados con cero o unoBar. La razón por la que no tratoBarcomo un subrecursoFooes porque la mismaBarinstancia 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 Fooinstancia también están interesados en la Barinstancia 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 elFoopunto 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" delfooandbarrecurso. 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?
Barno puede existir sin estar asociado a a Foo. Sin embargo, como escribí anteriormente, es posible que múltiples Foocorreos compartan lo mismo Bar. Debería ser posible crear un Foosin un Barasociado, por lo que no creo Barque deba tratarse como padre.