Sto sviluppando un'API RESTful. Questa è la mia prima API, ma anche il mio primo vero progetto di codifica. Come tale, sto ancora imparando molto su architettura eccAPI RESTful: dove dovrei codificare il mio flusso di lavoro?
Attualmente, ho il mio setup api nei seguenti strati:
- strato HTTP
- strato Resource
- Domain Model/Affari Logic strato
- Data Access/strato repository
- Persistent Storage/DB strato
Il problema a cui mi sono imbattuto al momento è dove devo mettere gli oggetti/i gestori del flusso di lavoro? Per flussi di lavoro, intendo codice che valuta quale passo successivo è richiesto dall'utente finale. Ad esempio, un flusso di lavoro di e-commerce. L'utente aggiunge l'articolo al carrello, quindi controlla, quindi inserisce i dati personali, quindi paga. Il flusso di lavoro sarebbe responsabile per decidere quali passi sono successivi, ma anche quali passaggi NON sono consentiti. Ad esempio, un utente non può causare errori nell'API tentando di pagare prima di aver inserito i dettagli personali (forse richiamano l'URI per i pagamenti e tentano di saltare un passaggio). Il flusso di lavoro controllerebbe che tutti i passaggi precedenti fossero stati completati, in caso contrario non avrebbe consentito il pagamento.
Attualmente la logica del flusso di lavoro è nel livello risorse. Sto usando i collegamenti ipermediali per presentare il flusso di lavoro all'utente, ad es. fornendo un link 'next step'. Il problema che ho con questo è che il livello di risorse è un livello superiore e più allineato con la presentazione. Ritengo che sia necessario conoscere troppo il modello di dominio sottostante per valutare efficacemente un flusso di lavoro, ovvero che dovrebbe sapere che deve controllare l'entità personal_detail
s prima di consentire il pagamento.
Questo mi porta ora a pensare che i flussi di lavoro appartengano al modello di dominio. Questo ha molto più senso, dal momento che i flussi di lavoro sono parte della logica aziendale e penso che siano quindi nella posizione migliore nel livello dominio. Dopo tutto, sostituisci il Livello risorse con qualcos'altro, e avresti ancora bisogno dei flussi di lavoro sottostanti.
Ma ora il problema è che i flussi di lavoro richiedevano la conoscenza di diversi oggetti di dominio per completare la loro logica. Ora sembra giusto che vada nel suo stesso livello? Tra risorsa e livello di dominio?
- strato HTTP
- strato Resource
- strato Workflow
- Domain Model/Business Logic strato
- Data Access/strato repository
- Persistent Storage/DB strato
Mi sto solo chiedendo se qualcuno ha avuto altre opinioni o pensieri su questo? Come ho detto, non ho esperienza di applicazione passata per sapere dove devono essere collocati i flussi di lavoro. Im davvero solo imparando questo per la prima volta, quindi voglio essere sicuro che sto andando su di esso nel modo giusto.
I collegamenti ad articoli o blog che trattano questo sarebbero molto apprezzati. Ama leggere su diverse implementazioni.
EDIT
Per chiarire, io rilascio che hateoas permette al cliente di navigare attraverso il 'flusso di lavoro', ma ci deve essere qualcosa nel mio API che sa cosa si collega a mostrare vale a dire che è davvero definire il flusso di lavoro che è permesso. Presenta collegamenti relativi al flusso di lavoro nella risorsa, ma in aggiunta convalida le richieste in sincronia con il flusso di lavoro. Mentre sono d'accordo che un cliente probabilmente seguirà solo i collegamenti forniti nella risorsa, il pericolo (e la bellezza) del riposo, è che il suo URI è guidato, quindi non c'è nulla che impedisca a un cliente dispettoso di tentare di saltare i passaggi nel flusso di lavoro fare una supposizione istruita all'URI. L'API deve individuare questo e restituire una risposta 302.
Non sono d'accordo con quello che hai detto. Un'API REST utilizza HATEOAS per consentire all'utente di definire un "flusso di lavoro" attraverso l'app. Ma quello che stai dicendo è che dovremmo consentire all'utente (o all'app client) di definire la logica e fare tutto ciò che vogliono !! Questo è chiaramente sbagliato. Quindi, quello di cui sto parlando è garantire che il "flusso di lavoro" che il cliente sta seguendo sia permesso. Alcune parti dell'API devono essere responsabili dell'elaborazione di quali collegamenti possono essere visualizzati con una risorsa (il flusso di lavoro) e anche di convalidare che le richieste non sono al di fuori del flusso di lavoro (es. Restituire un 302) vedere l'aggiornamento sopra –
Perché il server è fornendo javascript al client che il client usa per determinare se visualizzare o meno un collegamento, il server sta sostanzialmente estendendo la sua logica sul client e quindi sta ancora determinando il flusso di lavoro. Non c'è nulla che ti impedisca di iniettare un livello aziendale nella tua architettura tra l'interfaccia utente e i servizi REST, ma quando lo fai, a seconda di come lo implementa, l'interfaccia utente potrebbe non comunicare più RESTfully. –
E dove dovrebbe vivere questo livello aziendale? –