Я делаю RESTful API совсем немного (выставляя и потребляя третьи стороны), и я вижу два следующих шаблона, которые появляются здесь и там. У каждого есть плюсы и минусы, и ни один из них не является «чистым», на мой взгляд.Правильный шаблон маршрута для коллекций RESTful с дополнительными ресурсами
Итак, ситуация: у вас есть ресурс коллекции (например, «активы»), и вы хотите выставить дополнительные ресурсы в коллекции (например, субресурсы самой коллекции, а не актива, такие как агрегированная конечная точка представления или некоторые команды).
Две модели я вижу, являются:
Люди создают RESTful коллекции ресурсов, как
/assets/${asset-id}
и выставить все остальное им нужно какGET /assets/owned
,GET /assets/summary
,POST /assets/recheck-inventory
. Это выглядит аккуратно и кратким, но вводит столкновение между${asset-id}
и существительными URL-адресов подресурсов (например,asset12345
иsummary
находятся на том же месте в URL-адресе).Другие делают
/assets/items/${asset-id}
и выставляют все, какGET /assets/owned
,GET /assets/summary
и так далее. Это более чистое из перспективы маршрутизации и немного более надежное будущее, но добавляет дополнительное существительное в маршрут, что приводит к путанице, когда люди пытаются сделатьPOST /assets
, например.
Рекомендации по «лучшей практике», которые я прошел, до сих пор полностью избегают вопроса. Я также понимаю, что REST - это конвенция, а не стандарт, и есть универсальный ответ «это зависит». Тем не менее, я чувствую, что здесь должна быть общая рекомендация.
Следовательно, возникает вопрос: какой из двух вы бы использовали?
UPDATE: выяснить, давайте предположим, что:
/assets/owned
содержит объекты различных типов, а не активов, так что это не запрос, и вы можете GET/POST/DELETE элементов в нем./assets/summary
представляет собой совокупность документов (например, отчет с величинами, например)/assets/recheck-inventory
является командой (т.е. POST только)
Кроме того, мы хотим придерживаться принципов REST:
- маршрут маршрута должен идентифицировать объект и его состояние однозначно.
- параметры запроса изменяют, какие элементы возвращаются, но не изменяют формат полезной нагрузки.
- заголовки для информации на уровне протокола и не меняют логику службы (т.е. представление, безопасность, кэширование и т.д.)
Относительно одного из ваших последних пунктов: Путь в URL-адресе может быть любым, включая только GUID без иерархии, и интерфейс все равно может быть RESTful. –