Ci sono alcune buone risposte qui, ma non sono sicuro che ti aiuteranno a convincere i tuoi colleghi. Come molti hanno sottolineato, ciò che stai suggerendo non è un passaggio dal design RESTful e penso che sia la chiave per farli aderire alla tua proposta.
REST non si assicura che l'API consenta solo di archiviare e recuperare dati. Piuttosto, si occupa di modellare le azioni come risorse. L'API dovrebbe consentire di intraprendere azioni ( dopotutto è un'interfaccia di programmazione dell'applicazione ). La domanda è come modellare quelle azioni.
Invece di trovare un termine, gli esempi sono probabilmente il modo migliore per spiegarlo ai tuoi colleghi . In questo modo puoi mostrare come lo stanno facendo ora, quali problemi provoca, una soluzione che risolve il problema e come rimane RESTful.
Diamo un'occhiata al tuo oggetto Cliente.
Problema:
L'interfaccia utente invia un cliente, ma le tabelle successive non sono ancora state aggiornate. Cosa succede se una delle chiamate successive non riesce a causa di un errore nel codice dell'interfaccia utente (o di un plugin del browser che si comporta male, ecc.)? Ora i tuoi dati sono in uno stato incoerente. Potrebbe anche essere uno stato che rompe altre parti dell'API o dell'interfaccia utente, per non parlare del fatto che non è semplicemente valido. Come ti riprendi? Dovresti testare ogni stato possibile per essere sicuro che ciò non rompa qualcosa, ma sarebbe difficile sapere cosa è possibile.
Soluzione:
Crea un endpoint API per creare clienti. Sai che non vuoi avere un endpoint "/ customer / create" o "/ create-customer", perché create è un verbo e violerebbe REST. Quindi nominalo. "/ customer-creation" potrebbe funzionare. Ora quando POST l'oggetto CustomerCreation, invierà tutti i campi necessari per la creazione completa di un cliente. L'endpoint garantirà che i dati siano completi e validi (restituendo un valore di 400 o qualcosa del genere se fallisce la convalida) e, ad esempio, potrebbe persistere all'interno di una singola transazione db.
Se hai anche bisogno di un endpoint per GET / oggetti cliente, va bene. Puoi avere entrambi. Il trucco è creare endpoint che soddisfino le esigenze dei consumatori.
vantaggi:
- Garantisci che non finirai con un cattivo stato
- In realtà è più facile per gli sviluppatori dell'interfaccia utente se non devono "conoscere" l'ordine delle richieste, i problemi di convalida, ecc
- Non è loquace di un'API, riducendo la latenza delle richieste di rete
- È più facile testare e concettualizzare gli scenari (parti mancanti / non corrette dell'interfaccia utente non sono distribuite tra le richieste, alcune delle quali potrebbero non riuscire)
- Consente una migliore incapsulamento della logica aziendale
- In genere semplifica la sicurezza (poiché la logica aziendale e di orchestrazione nell'interfaccia utente può essere modificata dagli utenti)
- Ridurrà probabilmente la duplicazione della logica (più probabilmente avrai 2+ utenti di un'API rispetto alle 2+ API che danno accesso agli stessi dati)
- Ancora al 100% RESTful
svantaggi:
- È potenzialmente più lavoro per lo sviluppatore back-end (ma potrebbe non essere a lungo termine)
Potrebbe essere difficile per le persone comprendere questo paradigma e cosa c'è di buono se non lo hanno provato. Spero che tu possa aiutarli a vedere usando un esempio dal tuo codice.
La mia esperienza personale è che una volta che gli sviluppatori del mio team hanno iniziato a implementare questa strategia, hanno visto quasi immediatamente i vantaggi.
Ulteriore studio:
Questo articolo di Thoughworks mi ha davvero aiutato ad avere l'idea di modellare le azioni come oggetti usando esempi pratici: https://www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling
Vorrei anche suggerire di leggere su CQRS e Event Sourcing in quanto si occupano proprio di questo tipo di cose (cioè separare l'API dall'attuale logica di persistenza). Non so quanto sarebbero disposti i tuoi colleghi a leggere questo genere di cose, ma potrebbe darti più chiarezza e aiutarti a spiegarglielo.