Мені не подобається бачити {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
не перетинаючись з (потенційним майбутнім) іменем субресурсу.