La tua lingua, " Sembra molto dispendiosa ...", per me indica un tentativo di ottimizzazione prematura. A meno che non si possa dimostrare che l'invio dell'intera rappresentazione di oggetti è un importante risultato prestazionale (stiamo parlando inaccettabili per gli utenti con> 150 ms), non ha senso tentare di creare un nuovo comportamento API non standard. Ricorda, più semplice è l'API, più è facile da usare.
Per le eliminazioni inviare quanto segue in quanto il server non ha bisogno di sapere nulla sullo stato dell'oggetto prima che si verifichi l'eliminazione.
DELETE /emails
POSTDATA: [{id:1},{id:2}]
L'idea successiva è che se un'applicazione sta riscontrando problemi di prestazioni relativi all'aggiornamento in blocco degli oggetti, dovrebbe essere considerata la possibilità di suddividere ogni oggetto in più oggetti. In questo modo il payload JSON è una frazione delle dimensioni.
Ad esempio, quando si invia una risposta per aggiornare gli stati "letto" e "archiviato" di due e-mail separate, è necessario inviare quanto segue:
PUT /emails
POSTDATA: [
{
id:1,
to:"someone@bratwurst.com",
from:"someguy@frommyville.com",
subject:"Try this recipe!",
text:"1LB Pork Sausage, 1 Onion, 1T Black Pepper, 1t Salt, 1t Mustard Powder",
read:true,
archived:true,
importance:2,
labels:["Someone","Mustard"]
},
{
id:2,
to:"someone@bratwurst.com",
from:"someguy@frommyville.com",
subject:"Try this recipe (With Fix)",
text:"1LB Pork Sausage, 1 Onion, 1T Black Pepper, 1t Salt, 1T Mustard Powder, 1t Garlic Powder",
read:true,
archived:false,
importance:1,
labels:["Someone","Mustard"]
}
]
Dividerei i componenti mutabili dell'email (leggi, archiviati, importanza, etichette) in un oggetto separato poiché gli altri (a, da, oggetto, testo) non verrebbero mai aggiornati.
PUT /email-statuses
POSTDATA: [
{id:15,read:true,archived:true,importance:2,labels:["Someone","Mustard"]},
{id:27,read:true,archived:false,importance:1,labels:["Someone","Mustard"]}
]
Un altro approccio da adottare è quello di sfruttare l'uso di un PATCH. Indicare esplicitamente quali proprietà si intende aggiornare e che tutte le altre devono essere ignorate.
PATCH /emails
POSTDATA: [
{
id:1,
read:true,
archived:true
},
{
id:2,
read:true,
archived:false
}
]
Le persone affermano che PATCH dovrebbe essere implementato fornendo una serie di modifiche contenenti: azione (CRUD), percorso (URL) e modifica del valore. Questa può essere considerata un'implementazione standard, ma se si esamina l'intera API REST è una tantum non intuitivo. Inoltre, l'implementazione sopra è come GitHub ha implementato PATCH .
Per riassumere, è possibile aderire ai principi RESTful con azioni batch e avere comunque prestazioni accettabili.