Mam hierarchię obiektów, którą muszę ujawnić za pośrednictwem interfejsu API RESTful i nie jestem pewien, jak powinny być zbudowane moje adresy URL i co powinny zwracać. Nie udało mi się znaleźć żadnych najlepszych praktyk.
Powiedzmy, że mam psy i koty dziedziczące po zwierzętach. Potrzebuję operacji CRUD na psach i kotach; Chcę też mieć możliwość wykonywania ogólnych operacji na zwierzętach.
Moim pierwszym pomysłem było zrobienie czegoś takiego:
GET /animals # get all animals
POST /animals # create a dog or cat
GET /animals/123 # get animal 123
Chodzi o to, że kolekcja / animals jest teraz „niespójna”, ponieważ może zwracać i przyjmować obiekty, które nie mają dokładnie tej samej struktury (psy i koty). Czy kolekcję zwracającą obiekty o różnych atrybutach uważa się za „RESTful”?
Innym rozwiązaniem byłoby utworzenie adresu URL dla każdego konkretnego typu, na przykład:
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
Ale teraz związek między psami i kotami jest stracony. Jeśli ktoś chce odzyskać wszystkie zwierzęta, należy zapytać zarówno o zasoby psa, jak i kota. Liczba adresów URL również będzie wzrastać z każdym nowym podtypem zwierzęcia.
Inną sugestią było rozszerzenie drugiego rozwiązania poprzez dodanie tego:
GET /animals # get common attributes of all animals
W takim przypadku zwrócone zwierzęta będą zawierały tylko atrybuty wspólne dla wszystkich zwierząt, z pominięciem atrybutów specyficznych dla psów i kotów. Pozwala to na odzyskanie wszystkich zwierząt, choć z mniejszą liczbą szczegółów. Każdy zwracany obiekt może zawierać link do szczegółowej, konkretnej wersji.
Jakieś uwagi lub sugestie?