Non mi piace vedere la {id}
parte degli URL che si sovrappone alle risorse secondarie, dal momento id
che teoricamente potrebbe esserci qualsiasi cosa e ci sarebbe ambiguità. Sta mescolando concetti diversi (identificatori e nomi delle risorse secondarie).
Problemi simili sono spesso visto in enum
costanti o una cartella di strutture, dove i diversi concetti sono misti (ad esempio, quando si dispone di cartelle Tigers
, Lions
e Cheetahs
, e poi anche una cartella denominata Animals
allo stesso livello - questo non ha senso, come uno è un sottoinsieme della altro).
In generale, penso che l'ultima parte nominata di un endpoint dovrebbe essere singolare se si tratta di una singola entità alla volta, e plurale se si tratta di un elenco di entità.
Quindi endpoint che riguardano un singolo utente:
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
Quindi esiste una risorsa separata per eseguire query sugli utenti, che generalmente restituiscono un elenco:
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
E qui alcuni esempi di una sotto-risorsa che si occupa di un utente specifico:
GET /user/{id}/friends -> Returns a list of friends of given user
Fai amicizia (link da molti a molti):
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
Non c'è mai alcuna ambiguità e la denominazione plurale o singolare della risorsa è un suggerimento per l'utente cosa possono aspettarsi (elenco o oggetto). Non ci sono restrizioni su id
s, teoricamente rendendo possibile avere un utente con l'id new
senza sovrapposizioni con un nome (potenziale futuro) della sotto-risorsa.