Je n'aime pas voir la {id}
partie des URL se chevaucher avec des sous-ressources, car cela id
pourrait théoriquement être n'importe quoi et il y aurait une ambiguïté. Il mélange différents concepts (identifiants et noms de sous-ressources).
Des problèmes similaires sont souvent vus dans des enum
constantes ou dossier structures, où les différents concepts sont mélangés (par exemple, lorsque vous avez des dossiers Tigers
, Lions
et Cheetahs
, puis aussi un dossier appelé Animals
au même niveau - cela n'a aucun sens que l' on est un sous - ensemble de la autre).
En général, je pense que la dernière partie nommée d'un point de terminaison devrait être singulière si elle concerne une seule entité à la fois, et plurielle si elle traite d'une liste d'entités.
Donc, les points de terminaison qui traitent avec un seul utilisateur:
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
Ensuite, il existe une ressource distincte pour effectuer des requêtes sur les utilisateurs, qui retournent généralement une liste:
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
Et voici quelques exemples d'une sous-ressource qui traite avec un utilisateur spécifique:
GET /user/{id}/friends -> Returns a list of friends of given user
Faites-vous un ami (lien plusieurs à plusieurs):
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
Il n'y a jamais d'ambiguïté, et la dénomination plurielle ou singulière de la ressource est une indication pour l'utilisateur de ce à quoi il peut s'attendre (liste ou objet). Il n'y a pas de restrictions sur id
s, ce qui permet théoriquement d'avoir un utilisateur avec l'id new
sans chevaucher avec un nom de sous-ressource (futur potentiel).