Tengo una jerarquía de objetos que necesito exponer a través de una API RESTful y no estoy seguro de cómo deberían estructurarse mis URL y qué deberían devolver. No pude encontrar las mejores prácticas.¿Cómo modelar una API RESTful con herencia?
Digamos que tengo Perros y Gatos que heredan de Animales. Necesito operaciones CRUD en perros y gatos; También quiero poder hacer operaciones con animales en general.
Mi primera idea era hacer algo como esto:
GET /animals # get all animals
POST /animals # create a dog or cat
GET /animals/123 # get animal 123
Lo que pasa es que la colección/animales es ahora "incompatibles", ya que puede volver a sacar los objetos que no tienen exactamente la misma estructura (perros y gatos). ¿Se considera "RESTful" tener una colección que devuelve objetos que tienen diferentes atributos?
Otra solución sería la creación de una dirección URL para cada tipo de hormigón, así:
GET /dogs # get all dogs
POST /dogs # create a dog
GET /dogs/123 # get dog 123
GET /cats # get all cats
POST /cats # create a cat
GET /cats/123 # get cat 123
Pero ahora se pierde la relación entre perros y gatos. Si uno desea recuperar todos los animales, se deben consultar los recursos de ambos perros y gatos. El número de URL también aumentará con cada nuevo subtipo de animal.
Otra sugerencia fue la de aumentar la segunda solución mediante la adición de esto:
GET /animals # get common attributes of all animals
En este caso, los animales volvieron solamente contendría atributos comunes a todos los animales, dejando caer los atributos específicos de cada perro y específicos de cada gato. Esto permite recuperar todos los animales, aunque con menos detalles. Cada objeto devuelto podría contener un enlace a la versión detallada y concreta.
¿Algún comentario o sugerencia?
Esto parece muy similar a "fundición" a través de una API REST. También me recuerda los problemas/soluciones en el diseño de la memoria de una subclase de C++. Por ejemplo, dónde y cómo representar simultáneamente una base y una subclase con una sola dirección en la memoria. – trcarden
Sugiero: 'GET/animals - gets all dogs and cats' ' GET/animals/dogs - gets all dogs' 'GET/animals/cats - gets all cats' – dipold
Además de especificar el tipo deseado como un Parámetro de solicitud GET: me parece que podría usar accept type para lograr esto también. Es decir: 'GET/animals' Accept' application/vnd.vet-services.animal.dog + json' –