Considera una pagina web in cui un utente cambia la sua password dopo aver fatto clic su un link di reimpostazione della password via email.
La pagina verrà implementata rispetto a un'API utilizzando ajax, piuttosto che come una normale sottomissione di modulo. Cioè, questa domanda riguarda la progettazione di un endpoint API per la modifica di una password.
Requisiti
Ogni volta che viene modificata una password, la modifica deve essere registrata nel database nella tabella password_changes
:
password_changes
- user_id
- date_changed
Domanda specifica
Pensando a questo progetto dal punto di vista degli endpoint API che creano, aggiornano o eliminano "risorse" astratte, ha più senso pensare alla modifica della password come:
-
Stiamo aggiornando la risorsa "utente", quindi dovrebbe
PUT
una nuova password su/user/{id}
o forse/user/{id}/password
? In questo modello, registrare la modifica inpassword_changes
è solo un dettaglio di implementazione irrilevante e non ha alcun impatto sul nostro concetto di risorsa "utente" o sul nome del nostro endpoint. -
Stiamo creando un "password_change". Quindi dovremmo essere
POST
a/user/{id}/password_change
o qualcosa di simile. In questo modello, la modifica alla risorsa "utente" è solo un effetto collaterale della creazione di una "password_change".
In questo particolare esempio, penso che la maggior parte delle persone scelga l'opzione 1. E in effetti mi sembra anche più naturale. Compra perché? È solo una questione di giudizio, gusto o intuizione? O c'è qualche principio codificato di REST o anche i concetti di base delle risorse e delle azioni http che l'opzione 2. viola chiaramente?
Altre domande generali
Che cosa succede se forniamo una cronologia delle modifiche della password come nuovo enpoint: /user/{id}/password_changes
?
Sembra un servizio ragionevole.
Ma se ci atteniamo al design 1., ora apportiamo le modifiche della password apportando PUT
s a /user
ma visualizzandole con GET
s su /user/{id}/password_changes
. E poi limitiamo semplicemente altre azioni http a password_changes
(PUT, POST, DELETE)? Sembra incoerente ... o forse no?
Ancora una volta, quali sono le regole (o anche le euristiche) che governano queste decisioni? Posso fare chiamate di giudizio, ma sto cercando qualcosa di più definitivo.