Ваша мова "Це здається дуже марною ..." для мене вказує на спробу передчасної оптимізації. Якщо не може бути показано, що надсилання всього представлення об'єктів є головним ударом (ми говоримо неприйнятно для користувачів, як> 150 мс), тоді немає сенсу намагатися створити нову нестандартну поведінку API. Пам'ятайте, чим простіше API, тим простіше його використовувати.
Для делетів надсилайте наступне, оскільки серверу не потрібно нічого знати про стан об'єкта до того, як видалення відбудеться.
DELETE /emails
POSTDATA: [{id:1},{id:2}]
Наступна думка полягає в тому, що якщо програма стикається з проблемами продуктивності щодо масового оновлення об'єктів, то слід розглянути питання про розбиття кожного об'єкта на кілька об'єктів. Таким чином корисне навантаження JSON є часткою від розміру.
Як приклад при надсиланні відповіді на оновлення статусів "прочитати" та "заархівовано" двох окремих електронних листів, вам доведеться надіслати наступне:
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"]
}
]
Я б розділив змінні компоненти електронної пошти (читання, архівування, важливість, мітки) на окремий об'єкт, оскільки інші (до, з теми, тексту) ніколи не оновлюються.
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"]}
]
Ще один підхід - скористатися використанням PATCH. Чітко вказати, які властивості ви збираєтесь оновити, а всі інші слід ігнорувати.
PATCH /emails
POSTDATA: [
{
id:1,
read:true,
archived:true
},
{
id:2,
read:true,
archived:false
}
]
Люди заявляють, що PATCH слід реалізувати, надаючи масив змін, що містять: дію (CRUD), шлях (URL) та зміну значення. Це може вважатися стандартною реалізацією, але якщо дивитися на весь REST API, це неінтуїтивний одноразовий. Крім того, вищевказана реалізація - це те, як GitHub реалізував PATCH .
Підсумовуючи це, можна дотримуватися принципів RESTful за допомогою пакетних дій і все ще мати прийнятну продуктивність.