Votre langage, "Cela me semble très inutile ...", indique pour moi une tentative d'optimisation prématurée. À moins qu'il ne puisse être démontré que l'envoi de la représentation entière des objets est un impact majeur sur les performances (nous parlons d'inacceptable pour les utilisateurs comme> 150 ms), il est inutile d'essayer de créer un nouveau comportement d'API non standard. N'oubliez pas que plus l'API est simple, plus elle est facile à utiliser.
Pour les suppressions, envoyez ce qui suit car le serveur n'a pas besoin de savoir quoi que ce soit sur l'état de l'objet avant la suppression.
DELETE /emails
POSTDATA: [{id:1},{id:2}]
L'idée suivante est que si une application rencontre des problèmes de performances concernant la mise à jour en masse des objets, il faut envisager de diviser chaque objet en plusieurs objets. De cette façon, la charge utile JSON est une fraction de la taille.
À titre d'exemple, lors de l'envoi d'une réponse pour mettre à jour les statuts «lu» et «archivé» de deux e-mails distincts, vous devrez envoyer ce qui suit:
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"]
}
]
Je diviserais les composants modifiables de l'e-mail (lu, archivé, importance, étiquettes) en un objet séparé car les autres (vers, depuis, sujet, texte) ne seraient jamais mis à jour.
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"]}
]
Une autre approche à adopter consiste à tirer parti de l'utilisation d'un PATCH. Pour indiquer explicitement les propriétés que vous envisagez de mettre à jour et que toutes les autres doivent être ignorées.
PATCH /emails
POSTDATA: [
{
id:1,
read:true,
archived:true
},
{
id:2,
read:true,
archived:false
}
]
Les gens déclarent que PATCH doit être implémenté en fournissant un tableau de modifications contenant: action (CRUD), chemin (URL) et changement de valeur. Cela peut être considéré comme une implémentation standard, mais si vous regardez l'intégralité d'une API REST, il s'agit d'une mise en œuvre ponctuelle non intuitive. En outre, la mise en œuvre ci-dessus est de savoir comment GitHub a implémenté PATCH .
Pour résumer, il est possible d'adhérer aux principes RESTful avec des actions par lots tout en conservant des performances acceptables.