Как правильно вкладывать ресурсы в модель REST?

14

Я разрабатываю REST API сервиса и застрял на правильном способе вложения ресурсов.

Ресурсы: партнеры, тикеты, настройки

Связи между ресурсами:

  • у партнера много билетов,
  • партнер имеет набор настроек,

Деловая логика:

  • Вы можете перечислить всех партнеров в качестве анонимного пользователя,
  • Вы можете добавить новый билет для указанного партнера в качестве анонимного пользователя,
  • только партнер может перечислить свои билеты,
  • только партнер может изменить свои билеты,
  • только партнер может перечислить настройки,
  • только партнер может изменять настройки,

Что я делал до сих пор:

Партнерские ресурсы

GET / partners - список всех партнеров
GET / partners /: id - показать детали партнера, указанного: параметром id
GET / partners /: partner_id / tickets - список билетов
партнера GET / partners /: partner_id / tickets /: id - подробности указанного билета
партнера POST / partners /: partner_id / tickets - сохраняет новый билет
PUT / partners /: partner_id / tickets /: id - обновляет билет, указанный в параметре: идентификатор
GET / partners /: partner_id / settings - список настроек партнера
PUT / partners /: partner_id / settings - обновить настройки партнера

Проблема / Вопрос

Будет ли правильным способом разделять вложенные ресурсы (тикеты, настройки) на отдельные ресурсы или дублировать их как отдельные ресурсы?

Например

GET / tickets /: ID
POST / Билеты
PUT / Билеты /: ID

GET / настройки
PUT / настройки

Przemek
источник

Ответы:

8

HATEOAS :

GET /partners/:partner_id/tickets - список заявок партнера, то есть возвращает список URI, возможно, в форме /tickets/:id

GET /partners/:partner_id/tickets/:id - не нужно

POST /partners/:partner_id/tickets - создает заявку и связывается с партнером, возвращает 201 с новым URI формы /tickets/:id

Хавьер
источник
2
Теперь я понимаю больше. Большое спасибо :) Но как насчет производительности? Предположим, что такая ситуация: вы хотите создать список заявок с краткой информацией. Вы должны запросить список билетов для партнера и после этого запросить каждый билет индивидуально. Я прав?
Пшемек
Ну да. или вы можете /partners/:partner_id/ticketsвключить в список некоторые полезные данные для каждого тикета, а не только его канонический URI. Например, в JSON может быть [{href='/tickets/12',value=10,due='2013-08-13'},{href='/tickets/18',value=7,due='2013-09-02'}]так, чтобы клиент мог сразу показать некоторую таблицу и GET / PUT полный ресурс (ы) тикета для дополнительной манипуляции.
Хавьер
ОК Понятно.
Przemek
КСТАТИ. Для / partners /: partner_id / tickets следует ли предоставлять документы в разделе ресурсов для партнеров или билетов?
Przemek
@ Хавьер, как насчет удаления? DELETE /tickets/:id?
Мэнди Гао