Я столкнулся с проблемой на работе, когда я не могу найти информацию об обычном стандарте или практике выполнения операций CRUD в веб-службе RESTful с ресурсом, первичный ключ которого является составным из идентификаторов других ресурсов. Мы используем MVC WebApi для создания контроллеров. Например, у нас есть три таблицы:
Product
: ПК=идентификатор продуктаPart
: ПК=PartIdProductPartAssoc
: PK=(ProductId, PartId)
Продукт может состоять из многих частей, а часть может быть компонентом многих продуктов. Таблица ассоциаций также содержит дополнительную информацию, относящуюся к самой ассоциации, которую необходимо редактировать.
У нас есть классы ProductsController
и PartsController
, которые обрабатывают обычные операции GET/PUT/POST/DELETE с использованием шаблонов маршрутов, определенных как: {controller}/{id}/{action}
, так что работают следующие IRI:
- GET,POST
/api/Products
- возвращает все товары, создает новый товар - GET,PUT,DELETE
/api/Products/1
— извлекает/обновляет/удаляет продукт 1 - GET,POST
/api/Parts
- возвращает все части, создает новую часть - GET,PUT,DELETE
/api/Parts/2
— извлекает/обновляет/удаляет часть 2 - GET
/api/Products/1/Parts
- получить все детали для продукта 1 - GET
/api/Parts/2/Products
— получить все товары, для которых часть 2 является компонентом
У меня возникли проблемы с определением шаблона маршрута для ресурсов ProductPartAssoc. Как должен выглядеть шаблон маршрута и IRI для получения данных ассоциации? Придерживаясь соглашения, я ожидал бы что-то вроде:
- GET,POST
/api/ProductPartAssoc
— возвращает все ассоциации, создает ассоциацию - GET,PUT,DELETE
/api/ProductPartAssoc/[1,2]
— извлекает/обновляет/удаляет связь между продуктом 1 и частью 2.
Мои коллеги находят это эстетически неприятным и, похоже, считают, что было бы лучше вообще не иметь класса ProductPartAssocController
, а добавить дополнительные методы к ProductsController
для управления данными ассоциации:
- GET, PUT, DELETE
/api/Products/1/Parts/2
— получить данные для связи между продуктом 1 и частью 2, а не данные для части 2 как члена части 1, что было бы обычным случаем, основанным на других примерах, таких как/Book/5/Chapter/3
, которые я видел в другом месте. - POST Понятия не имею, как они ожидают, что IRI будет выглядеть. К сожалению, они принимают решения.
В конце концов, я думаю, что я ищу либо подтверждение, либо направление, на которое я могу указать и сказать: «Видите, это то, что делают другие люди».
Какова типичная практика работы с ресурсами, идентифицируемыми составными ключами?