У мене є ієрархія об’єктів, яку мені потрібно виставити через RESTful API, і я не впевнений, як мають бути структуровані мої URL-адреси та що вони повинні повертати. Я не міг знайти найкращих практик.
Скажімо, у мене є собаки та коти, які успадковують тварин. Мені потрібні операції CRUD на собаках і котах; Я також хочу мати можливість робити операції на тваринах загалом.
Моєю першою ідеєю було зробити щось подібне:
GET /animals # get all animals
POST /animals # create a dog or cat
GET /animals/123 # get animal 123
Річ у тім, що колекція / Animals тепер "непослідовна", оскільки вона може повернутися і взяти предмети, які не мають абсолютно однакової структури (собаки та коти). Чи вважається "RESTful" наявність колекції, що повертає об'єкти, що мають різні атрибути?
Іншим рішенням було б створити URL-адресу для кожного конкретного типу, наприклад:
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
Але тепер відносини між собаками та котами втрачені. Якщо ви хочете витягти всіх тварин, необхідно запитати ресурси як для собак, так і для котів. Кількість URL-адрес також буде збільшуватися з кожним новим підтипом тварин.
Ще однією пропозицією було доповнити друге рішення, додавши це:
GET /animals # get common attributes of all animals
У цьому випадку повернуті тварини міститимуть лише атрибути, загальні для всіх тварин, відкидаючи атрибути, характерні для собак та котів. Це дозволяє отримати всіх тварин, хоча і з меншою кількістю деталей. Кожен повернутий об’єкт може містити посилання на детальну, конкретну версію.
Будь-які зауваження чи пропозиції?