REST родительский идентификатор в URI - PullRequest
3 голосов
/ 19 февраля 2012

Скажем, моя модель состоит из Parent сущности, которая ссылается на некоторые Child сущности через свойство children. Сегмент пути URI определенного Child, согласно принципам REST, будет /parent/{parentId}/children/{childId}.

При выполнении операций обновления на Child обычно childId - это все, что мне нужно для уникальной идентификации правильного Child, считая сегмент parentId в пути избыточным. Эта избыточность усугубляется по мере усложнения иерархии.

Теперь, когда я думаю об этом, это также может вызвать неожиданное поведение: доступ к URI с одинаковыми childId, но с разными parentId может привести к тому же поведению, если программист не осознанный. Что должно произойти при доступе к Child в несвязанном Parent, так это то, что должен быть возвращен код ошибки клиента.

В настоящее время я думаю, что, возможно, не следует вводить иерархию в REST API, если она не является абсолютно интуитивно понятной, как это:

  1. Делает URI - таким образом, API - более сложным. Затвердевает ремонтопригодность.
  2. Из-за избыточности пользователи могут думать о результатах доступа к некоторым URI.
  3. Избыточность может стать ловушкой для неосведомленного программиста.

Есть ли способ избежать этой избыточности и при этом соответствовать принципам REST?

Ответы [ 3 ]

4 голосов
/ 19 февраля 2012

Да, просто структурируйте ваш URL следующим образом ...

/children/{childId}

Поскольку вы можете сделать вывод о родительском элементе от дочернего элемента на стороне сервера, нет никаких причин объявлять егов URL.Вы должны помещать несколько ресурсов в URL, только когда это абсолютно необходимо.Например, пользователь голосует за комментарий.Поскольку на стороне базы данных не существует формального способа определения, вы должны создать URL-адрес, например ..

/voter/{userId}/comment/{commentId}/upvote

1 голос
/ 04 сентября 2013

для меня ответ на этот вопрос будет зависеть от моделирования данных, а для моделирования данных вопрос «использовать составной ключ для дочерней модели или нет», если он использует составной ключ, поэтому вы должны поместить родительский идентификатор в URIесли нет, и child имеет свой собственный идентификатор, который не является составным, так что вы можете просто использовать URL только с child ID.

, так что это вопрос моделирования данных !!!

1 голос
/ 19 февраля 2012

Поскольку REST относится к ресурсам, они не обязательно должны быть иерархическими.

В похожем API у меня есть разделы, категории и статьи. Каждый из них, конечно, находится под другим, но в REST я указываю их как section / {id} & article / {id}. Они по-прежнему являются ссылками на отдельные ресурсы, но поскольку они МОГУТ быть независимыми от своего родителя, иерархия не важна для указания в URI.

Если вы определенно хотите указать иерархию в URI, вам следует убедиться, что родительский объект является родительским для дочернего, и в противном случае выдать ошибку - чтобы сохранить иерархическую целостность.

TL; DR

  • / родитель / {ParentId}
  • / ребенок / {childID}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...