Как смоделировать RESTful API с наследник се?

У меня есть иерархия объектов, которую мне нужно предоставить через 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

В этом случае возвращенные животные будут содержать только атрибуты, общие для всех животных, отбрасывая атрибуты, специфичные для собак и кошек. Это позволяет получить всех животных, хотя и с меньшим количеством деталей. Каждый возвращаемый объект может содержать ссылку на подробную, конкретную версию.

Есть комментарии или предложения?

79
задан Alpha Hydrae 4 June 2012 в 11:26
поделиться