Eu tenho uma hierarquia de objetos que preciso expor por meio de uma API RESTful e não tenho certeza de como meus URLs devem ser estruturados e o que eles devem retornar. Não consegui encontrar as melhores práticas.
Digamos que eu tenha cães e gatos herdando de animais. Preciso de operações CRUD em cães e gatos; Eu também quero fazer operações em animais em geral.
Minha primeira ideia era fazer algo assim:
GET /animals # get all animals
POST /animals # create a dog or cat
GET /animals/123 # get animal 123
Acontece que a coleção / animals passou a ser "inconsistente", pois pode retornar e retirar objetos que não possuem exatamente a mesma estrutura (cães e gatos). É considerado "RESTful" ter uma coleção que retorna objetos com atributos diferentes?
Outra solução seria criar um URL para cada tipo concreto, assim:
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
Mas agora a relação entre cães e gatos está perdida. Se alguém deseja recuperar todos os animais, os recursos do cão e do gato devem ser consultados. O número de URLs também aumentará com cada novo subtipo de animal.
Outra sugestão era aumentar a segunda solução adicionando isto:
GET /animals # get common attributes of all animals
Nesse caso, os animais retornados conteriam apenas atributos comuns a todos os animais, descartando atributos específicos para cães e gatos. Isso permite recuperar todos os animais, embora com menos detalhes. Cada objeto retornado pode conter um link para a versão detalhada e concreta.
Algum comentário ou sugestão?