Мне не нравится, когда {id}
часть URL-адресов пересекается с подресурсами, какid
теоретически может быть что угодно, и возникнет неоднозначность. Он смешивает разные понятия (идентификаторы и имена подресурсов).
Подобные вопросы часто рассматриваются в enum
постоянных или папки структур, где разные понятия смешиваются (например, когда у вас есть папки Tigers
, Lions
и Cheetahs
, а затем также папка Animals
на том же уровне - это не имеет никакого смысла , так как один является подмножеством Другой).
В общем, я думаю, что последняя именованная часть конечной точки должна быть единственной, если она имеет дело с одной сущностью за раз, и множественной, если она имеет дело со списком сущностей.
Итак, конечные точки, которые имеют дело с одним пользователем:
GET /user -> Not allowed, 400
GET /user/{id} -> Returns user with given id
POST /user -> Creates a new user
PUT /user/{id} -> Updates user with given id
DELETE /user/{id} -> Deletes user with given id
Тогда есть отдельный ресурс для выполнения запросов к пользователям, которые обычно возвращают список:
GET /users -> Lists all users, optionally filtered by way of parameters
GET /users/new?since=x -> Gets all users that are new since a specific time
GET /users/top?max=x -> Gets top X active users
А вот несколько примеров подресурса, который имеет дело с конкретным пользователем:
GET /user/{id}/friends -> Returns a list of friends of given user
Завести друга (многие ко многим):
PUT /user/{id}/friend/{id} -> Befriends two users
DELETE /user/{id}/friend/{id} -> Unfriends two users
GET /user/{id}/friend/{id} -> Gets status of friendship between two users
Не существует никакой двусмысленности, и множественное или единственное именование ресурса является подсказкой пользователю, чего он может ожидать (список или объект). Нет никаких ограничений на id
s, теоретически позволяющих иметь пользователя с идентификатором new
без наложения на (потенциальное будущее) имя подресурса.