Nie lubię, gdy {id}
część adresów URL pokrywa się z podrzędnymi zasobamiid
teoretycznie może to być cokolwiek i byłoby niejednoznaczne. Łączy różne pojęcia (identyfikatory i nazwy pod-zasobów).
Podobne problemy są często postrzegane w enum
stałych lub folder struktur, gdzie różne koncepcje są mieszane (na przykład, gdy masz foldery Tigers
, Lions
a Cheetahs
, a następnie również folder o nazwieAnimals
na tym samym poziomie - to nie ma sensu, jak ktoś jest podzbiorem inny).
Ogólnie rzecz biorąc, myślę, że ostatnia nazwana część punktu końcowego powinna być pojedyncza, jeśli dotyczy ona pojedynczego elementu na raz, i liczba mnoga, jeśli dotyczy listy elementów.
Punkty końcowe, które dotyczą jednego użytkownika:
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
Następnie istnieje osobny zasób do wykonywania zapytań na użytkownikach, które zazwyczaj zwracają listę:
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
A oto kilka przykładów pod-zasobu, który zajmuje się konkretnym użytkownikiem:
GET /user/{id}/friends -> Returns a list of friends of given user
Zaprzyjaźnij się (link wiele do wielu):
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
Nigdy nie ma dwuznaczności, a mnoga lub pojedyncza nazwa zasobu jest wskazówką dla użytkownika, czego może się spodziewać (lista lub obiekt). Nie ma żadnych ograniczeń dotyczących id
s, teoretycznie umożliwiając posiadanie użytkownika o identyfikatorze new
bez nakładania się na (potencjalnie przyszłą) nazwę pod-zasobu.