I had the requirement to delete multiple list items for a clients SharePoint 2013 site. I wanted to stick with using REST as opposed to the CSOM as my custom built framework makes use of it primarily.

The way to accomplish this is to take advantage of ODATA’s batching. Rather than go to much into detail I’ll just give you the function.

The usage is quiet simple:


var batch = [ {  listName: "", id: }, ..... //more here ]

deleteByBatch(batch, success, error);


deleteByBatch: function(batch, success, error) {
var endpoint = _spPageContextInfo.webAbsoluteUrl + '/_api/$batch';
// generate a batch boundary
var batchGuid = generateUUID();
//creating the body
var batchContents = [];
var changeSetId = generateUUID();
//iterate through each item in batch
for (var i = 0; i & lt; batch.length; i++) {
var itemToDelete = batch[i];
//create the request endpoint
var endpoint = _spPageContextInfo.webAbsoluteUrl +
"/_api/web/lists/GetByTitle('" + itemToDelete.listName + "')/items(" +
itemToDelete.id + ")";
// create the changeset
batchContents.push('--changeset_' + changeSetId);
batchContents.push('Content-Type: application/http');
batchContents.push('Content-Transfer-Encoding: binary');
batchContents.push('');
batchContents.push('DELETE ' + endpoint + ' HTTP/1.1');
batchContents.push('IF-Match: *');
batchContents.push('');
batchContents.push('');
}
// END changeset to create data
batchContents.push('--changeset_' + changeSetId + '--');
// batch body
var batchBody = batchContents.join('\r\n');
batchContents = [];
// create batch for creating items
batchContents.push('--batch_' + batchGuid);
batchContents.push('Content-Type: multipart/mixed; boundary="changeset_'
+ changeSetId + '"');
batchContents.push('Content-Length: ' + batchBody.length);
batchContents.push('Content-Transfer-Encoding: binary');
batchContents.push('');
batchContents.push(batchBody);
batchContents.push('');
batchBody = batchContents.join('\r\n');
// create the request endpoint
var endpoint = _spPageContextInfo.webAbsoluteUrl + '/_api/$batch';
var batchRequestHeader = {
'X-RequestDigest': jQuery("#__REQUESTDIGEST").val(),
'Content-Type': 'multipart/mixed; boundary="batch_' + batchGuid + '"'
};
// create request
jQuery.ajax({
url: endpoint,
type: 'POST',
headers: batchRequestHeader,
data: batchBody,
success: function(response) {
if (success) {
success(response);
}
},
fail: function(msg) {
console.log("error", msg);
if (error) {
error(msg);
}
}
});