Длинная версия
Для некоторых, в том числе и для меня, одна из самых болезненных и причиняющих головную боль частей построения REST API - это определение имени для каждого ресурса и сопутствующих конечных точек.
Хотя это, конечно, зависит от личных предпочтений; Есть определенные вещи, которые поощряются сообществом. Например, большинство людей, включая меня, будут называть имена своих ресурсов множественными:
GET /notifications
POST /posts
Однако бывают случаи, когда плюрализм просто кажется неправильным. Рассмотрим следующий пример, где user
по существу представляет зарегистрированного пользователя, а не весь ресурс users
:
Конечные точки, относящиеся только к аутентифицированному пользователю
// Phone Verification
POST /user/phone/request
POST /user/phone/resend
POST /user/phone/verify
// User creation based on authenticated and verified phone
POST /user
// Update authenticated user's profile
PUT /user
// Delete the authenticated user
DELETE /user
// Add/remove the authenticated user's profile image
POST /user/image
DELETE /user/image
// Update the authenticated user's device token
PUT /device/token
Конечные точки, которые получают доступ ко всему ресурсу пользователя
GET /user
GET /user/{id|self}
В приведенном выше примере, мне кажется , как единственное user
имя ресурса больше подходит для данных на большинстве конечных точек, user
относится к аутентифицированному user
, а не вся база данных users
. Но, с другой стороны, GET /user
возвращает всех пользователей просто неправильно ...
В результате я сейчас разрываюсь между user
и users
- у обоих есть сильные аргументы в любом случае, насколько я вижу, но очень приветствую мнение другого человека по этому вопросу ...
Короткая версия
TLDR - Проще говоря, рассмотрим следующие две конечные точки:
// Get all users
GET /users
// Update the authenticated user's device token
PUT /user/device
Оба вышеперечисленных кажутся мне правильными. Проблема с вышесказанным заключается в том, что я не смогу получить и user
, и users
, по моему мнению, это должен быть один или другой.
Дилемма; Зачем мне использовать user
, когда ресурс относится ко всей базе данных пользователей? Зачем мне использовать users
, если ресурс относится только к аутентифицированному пользователю?
Я не могу разобраться с этим ... У кого-нибудь есть мысли по этому поводу? Или, что еще лучше, альтернативное решение моей предложенной структуры конечных точек?
Обновление
После некоторых глубоких размышлений я нашел альтернативное решение, но я все еще не уверен в этом на 100%, поскольку не слишком заинтересован в использовании имени ресурса auth
.
Учтите это:
// auth = authenticated user
// users = users collection
POST /auth/request
POST /auth/resend
POST /auth/verify
POST /auth
PUT /auth
DELETE /auth
POST /auth/image
DELETE /auth/image
PUT /auth/device/token
GET /users
GET /users/{id}