Обычно я выставляю конечные точки следующим образом:
/api/1/users
/api/1/users/{uid}
/api/1/groups
/api/1/groups/{gid}
/api/1/items
/api/1/items/{iid}
Для представления иерархии я обычно go следующим образом:
/api/1/groups/{gid}/users
/api/1/users/{uid}/items
Или чтобы получить аналогичные результаты:
/api/1/users?group_id={gid}
/api/1/items?user_id={uid}
Все идет хорошо, если вы не столкнетесь с этим:
/api/1/users
/api/1/groups # groups of users
/api/1/items
/api/1/groups # groups of items
Здесь я могу представить 2 варианта:
Чтобы изменить имя конечной точки:
/api/1/users
/api/1/groups
/api/1/items
/api/1/item_groups
Чтобы изменить путь, добавив некоторый префикс, пространство имен или область:
/api/1/{users_prefix}/users
/api/1/{users_prefix}/groups
/api/1/{items_prefix}/items
/api/1/{items_prefix}/groups
Я предпочитаю префиксы, потому что они делают отношения между элементами немного больше visible.
С другой стороны, такие конфликты довольно редки, а префиксы усложняют путь.
Также у меня есть сомнения, потому что / api / 1 / {items_prefix} не представляет никаких ресурсов или коллекций.
Хотя / api также не представляет, и обычно путь начинается с / api / {version}.
Итак, я не могу понять, как лучше всего разрешать конфликты имен с точки зрения принципов или лучших практик REST?
Заранее спасибо.