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 allontanamento dal design RESTful, e penso che sia la chiave per farli salire a bordo con la tua proposta.
REST è non sull'assicurazione che la tua API consenta solo l'archiviazione e il recupero dei dati. Piuttosto, si occupa delle azioni di modellazione come . La tua API dovrebbe abilitare le azioni da intraprendere (dopotutto è un'interfaccia Programmazione ). La domanda è come modellare tali azioni.
Piuttosto che inventare un termine, gli esempi sono probabilmente il modo migliore per spiegare questo ai tuoi colleghi . In questo modo puoi mostrare come lo stanno facendo ora, quali problemi causa, una soluzione che risolve il problema e come rimane ancora RESTful.
Esaminiamo l'oggetto Cliente.
Problema:
I POST UI sono un cliente, ma le tabelle successive non sono ancora state aggiornate. Cosa succede se una delle chiamate successive fallisce a causa di un errore nel codice UI (o nel malfunzionamento del plug-in del browser, ecc.)? Ora i tuoi dati sono in uno stato incoerente. Potrebbe anche essere uno stato che rompe altre parti della tua API o dell'interfaccia utente, senza contare che è semplicemente non valido. Come si recupera? Dovresti testare per ogni possibile stato per essere sicuro che questo non romperebbe 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 anche "/ create-customer", perché create è un verbo e violerebbe REST. Quindi lo si può dire. "/ creazione del cliente" potrebbe funzionare. Ora quando POST l'oggetto CustomerCreation, invierà tutti i campi necessari affinché un cliente possa essere completamente creato. L'endpoint assicurerà che i dati siano completi e validi (restituendo un 400 o qualcosa se fallisce la convalida), e potrebbero persistere tutti all'interno di una singola transazione db, per esempio.
Se hai 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 ti ritroverai con uno stato negativo
- In realtà è più facile sugli sviluppatori dell'interfaccia utente se non devono "sapere" l'ordine delle richieste, i problemi di convalida, ecc.
- Non è più come loquace di un'API, riducendo la latenza delle richieste di rete
- È più facile testare e concettualizzare gli scenari (frammenti di dati mancanti o malformati dall'interfaccia utente non sono distribuiti tra le richieste, alcuni dei quali potrebbero non riuscire)
- Consente un migliore incapsulamento della logica aziendale
- In genere rende la sicurezza più semplice (perché la logica di business e orchestrazione nell'interfaccia utente può essere modificata dagli utenti)
- Probabilmente ridurrà la duplicazione logica (più probabilmente avrai più di 2 utenti di un'API rispetto a 2+ API che danno accesso agli stessi dati)
- Ancora 100% RESTful
Svantaggi:
- È potenzialmente più utile per lo sviluppo del backend (ma potrebbe non essere a lungo termine)
Potrebbe essere difficile per le persone capire questo paradigma e ciò che è buono se non l'hanno provato. Spero che tu possa aiutarli a vedere usando un esempio dal tuo codice.
La mia esperienza è che una volta che gli sviluppatori del mio team hanno iniziato a implementare questa strategia, hanno visto quasi subito i vantaggi.
Ulteriore studio:
Questo articolo di thoughtworks mi ha davvero aiutato a ottenere l'idea di modellare le azioni come oggetti usando esempi pratici: link
Suggerirei anche di leggere su CQRS e Event Sourcing poiché riguardano proprio questo tipo di cose (cioè il divorzio dell'API dall'effettiva logica di persistenza). Non so quanto siano disposti i tuoi colleghi a leggere questo genere di cose, ma potrebbe darti più chiarezza e aiutarti a spiegarglielo.