Supponiamo che volessi progettare un'API REST che parla di canzoni, album e artisti (in realtà faccio, come 1312414 persone prima di me).RESTful modo di affrontare le relazioni bidirezionali tra le risorse
Una risorsa di song è sempre associata all'album di cui fa parte. Al contrario, la risorsa dell'album è associata a tutti i brani che contiene. Le associazioni sono espresse nelle rappresentazioni delle risorse tramite link.
Come tali, le rappresentazioni sarebbero simile a questa:
{
song: 'xyz',
links: [
{ rel: 'album', url: '.../albums/abc' }
]
}
{
album: 'abc',
links: [
{ rel: 'song', url: '.../songs/xyz' },
{ rel: 'song', url: '...' },
{ rel: 'song', url: '...' },
{ rel: 'song', url: '...' }
]
}
Dato, che voglio questo per tenere vero (forse il problema sta nel "Data"), allora come faccio a progettare il mio API , in modo tale che la creazione di un album o di una risorsa di brani non abbia effetti collaterali sulle risorse di brani o album precedentemente esistenti?
Questa è una specie di problema uovo/pollo. Se creo prima una risorsa canzone (POST/songs /) e poi creo una risorsa album (POST/albums /), la risorsa del brano viene modificata come parte della creazione dell'album (che è male secondo i principi REST), perché l'associazione tra le due risorse viene aggiornato sul server. Allo stesso modo per lo scenario in cui creo per primo l'album, il secondo della canzone.
Immagino di poter evitare l'intero problema evitando l'effetto collaterale sul server e passando l'onere di gestire le relazioni bidirezionali con il cliente.
Inoltre, non voglio che l'album e le canzoni vengano creati atomicamente nel loro complesso.
L'unica cosa che riesco a pensare al momento, è includere il suddetto effetto collaterale nella semantica della mia API rispondendo a una creazione di risorse con una rappresentazione che contiene un elenco di collegamenti a risorse che sono state modificate come risultato della richiesta. Questo rende esplicito l'effetto collaterale, ma non è comunque riposante.
creare un brano, se ha un campo album e l'album non esiste, creare l'album. crea un album, se ha una canzone che non esiste, crea la canzone. – zzzzBov
Un modo per guardarlo è che ogni album e canzone è una risorsa incapsulata e i collegamenti sono solo il grafico che li connette tra loro. La modifica dei collegamenti modifica la relazione tra le risorse ma le risorse non cambiano effettivamente. – abraham
"la risorsa del brano viene modificata come parte della creazione dell'album (che è male secondo i principi REST)" Quale principio è questo? Puoi fornire un collegamento? Nella mia esperienza l'aggiornamento delle risorse ha sempre effetti collaterali su altre risorse. –