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
PUTuna 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
POSTa/user/{id}/password_changeo 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.