Ho riflettuto molto sulle API REST di Hypermedia per le ultime due settimane. Una cosa di cui non sono abbastanza sicuro è come voglio modellare gli effetti collaterali sul lato server.
Nel mio progetto attuale, sto usando JSON + HAL come tipo di contenuto e sto facendo uso di collegamenti e risorse incorporate.
Ad esempio: supponiamo che alcune risorse A vengano PATCHed dal client, ad es. perché un valore monetario viene aggiornato. Supponiamo che questa risorsa sia utilizzata da un'altra risorsa B. Questa risorsa B rappresenta la somma di tutte le risorse di tipo A. Quindi la risorsa B avrebbe fornito un nuovo valore dopo che A è stato aggiornato. Qual è il modo migliore per comunicarlo al cliente? Le seguenti opzioni mi vengono in mente:
- Restituisce tutti i link eventualmente aggiornati nella risposta PATH, in particolare un collegamento a B. Il client proverà quindi a OTTENERE tutti i collegamenti forniti.
- Incorpora quelle risorse che potrebbero essere state aggiornate e fornire collegamenti a tutte le altre risorse pertinenti.
- Restituisce un link a una risorsa genitore di entrambi A e B, perché l'intero stato di A e B è stato modificato, e forse anche di più.
L'opzione 1) sembra non essere corretta, perché posso fornire collegamenti a risorse che non sono realmente nelle vicinanze di A. Inoltre, non riesco a distinguere tra le risorse che dovrei ottenere perché sono state aggiornate e le risorse che possono essere utili in altri modi (per navigare, manipolare lo stato dell'applicazione, creare nuove risorse, ...)
L'opzione 2) è fondamentalmente la stessa di 1), ma con il vantaggio che una risorsa incorporata mi dice direttamente lo stato della risorsa, che è utile quando incorporo B.
Opzione 3) mi sembra il migliore finora. In questo esempio potrei avere un "foglio di calcolo" di risorse parent, che contiene risorse di riga, come A, e una risorsa somma, come B. Se cambio una delle righe, ottengo un link al foglio di calcolo, che il client può quindi OTTIENI e ottieni tutte le righe e le somme incorporate o come link.
Forse mi mancano alcune altre opzioni. Non sono davvero sicuro di quale sia la migliore pratica qui.