RESTful поиск глубоко вложенных ресурсов - PullRequest
0 голосов
/ 06 октября 2018

Мне нужно реализовать поиск, который в моей голове звучит более подходящим для SOAP, чем сервис RESTful, поэтому я изо всех сил пытаюсь выразить его как конечную точку REST.

Модель домена

Company ( companyId )
Контракт ( contractId , companyId, privilegeGroupId)
PrivilegeGroup ( privilegeGroupId , privilegeId)
Privilege ( privilegeId )

Первичные ключи выделены жирным шрифтом.

Поиск в терминах SOAP

findPrivilegesByCompanyId

ВОССТАНОВИТЬ SOAP-запросы

Я пробовал вЕсть много способов привязать этот запрос к какому-либо запросу REST, но ничто не может убедить меня, потому что привилегии и компании не имеют прямой связи.
Фактическое отношение представлено этим длинным URI:

/ companies / {companyId} / контракты / привилегированные группы / привилегии

Однако, несмотря на то, что этот URI говорит правду, показывать его клиентам API не очень хорошая идея.Поэтому я пытаюсь найти несколько альтернатив:

  • GET / companies / {companyId} / privileges
  • GET / privileges / search? CompanyId = {companyId}

Есть идеи, как справиться с этими сценариями?Как выразить такие запросы в RESTful API?Это вообще возможно?Я думаю, что в теории результат этого запроса даже не является ресурсом в терминах REST.

Примечание. API уже предоставляет операции CRUD для каждого объекта модели предметной области.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Я думаю, что теоретически результат этого запроса даже не является ресурсом в терминах REST.

Это .

Ключевая абстракция информации в REST - это ресурс.Любая информация, которая может быть названа, может быть ресурсом

В REST URI является просто идентификатором для ресурса.Если мы хотим получить, например, привилегии Acme Corporation, этот URI является совершенно «спокойным»

/7B7F1B30-7A84-4406-8D88-FAC9B647AC12

Правописание не имеет значения для REST.

Ваша структура реализации,и вы, пользователи API, можете предпочесть взломанный URI ;но это не ограничение REST.

Более того, нет ограничения REST, которое требовало бы, чтобы у каждого объекта в вашей доменной модели был один и ровно один URI.«Ваша модель ресурсов - это НЕ модель вашего домена».

Короче говоря, если у вас есть одна конечная точка, которая создает представление этого результата запроса, и вам необходимо закодировать в идентификатор идентификатор компании, чтобы выполнить поиск, тогда это все отлично .

/7B7F1B30-7A84-4406-8D88-FAC9B647AC12/{companyId}
/7B7F1B30-7A84-4406-8D88-FAC9B647AC12?{companyId}
/{companyId}/7B7F1B30-7A84-4406-8D88-FAC9B647AC12
/7B7F1B30-7A84-4406-8D88-FAC9B647AC12;{companyId}

Трудная часть пытается выбрать семантически значимое / узнаваемое написание;По сути, это та же проблема, что и у вас, когда вы пытаетесь назвать переменную в вашем коде, и на вас распространяются аналогичные ограничения - то есть: компилятор не заботится , вы пишете, чтобы четко общаться с другими людьми.

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

0 голосов
/ 06 октября 2018

Если вы чувствуете, что между ресурсами нет прямой связи, вы можете использовать параметры запроса для фильтрации на основе другого ресурса.Пример: / privileges? Company_id = $ company_id

(IMO, слово search , которое вы упомянули в своем примере URL, не требуется для этого случая. Даже если поиск - это то, что происходит, он можеттакже рассматривается как фильтр, использующий другой идентификатор ресурса)

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