Twój język, „ Wydaje się bardzo marnotrawny…”, wskazuje mi na próbę przedwczesnej optymalizacji. O ile nie można wykazać, że wysyłanie całej reprezentacji obiektów jest dużym spadkiem wydajności (mówimy o nie do przyjęcia dla użytkowników jako> 150 ms), nie ma sensu próbować tworzyć nowego niestandardowego zachowania API. Pamiętaj, im prostsze API, tym łatwiejsze w użyciu.
W przypadku usuwania wyślij następujące informacje, ponieważ serwer nie musi nic wiedzieć o stanie obiektu przed usunięciem.
DELETE /emails
POSTDATA: [{id:1},{id:2}]
Następna myśl jest taka, że jeśli aplikacja ma problemy z wydajnością dotyczące zbiorczej aktualizacji obiektów, należy rozważyć podział każdego obiektu na wiele obiektów. W ten sposób ładunek JSON jest ułamkiem rozmiaru.
Na przykład podczas wysyłania odpowiedzi w celu zaktualizowania stanu „przeczytane” i „zarchiwizowane” dwóch oddzielnych wiadomości e-mail należy wysłać następujące informacje:
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"]
}
]
Rozdzieliłbym zmienne składniki wiadomości e-mail (odczyt, zarchiwizowanie, ważność, etykiety) na osobny obiekt, ponieważ inne (do, od, temat, tekst) nigdy nie byłyby aktualizowane.
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"]}
]
Innym podejściem, które można zastosować, jest wykorzystanie PATCH. Wyraźne wskazanie, które właściwości zamierzasz zaktualizować, a wszystkie inne należy zignorować.
PATCH /emails
POSTDATA: [
{
id:1,
read:true,
archived:true
},
{
id:2,
read:true,
archived:false
}
]
Ludzie twierdzą, że PATCH należy zaimplementować, dostarczając tablicę zmian zawierającą: akcję (CRUD), ścieżkę (URL) i zmianę wartości. Można to uznać za standardową implementację, ale jeśli spojrzeć na całość REST API, jest to nieintuicyjne rozwiązanie jednorazowe. Ponadto powyższa implementacja to sposób, w jaki GitHub zaimplementował PATCH .
Podsumowując, możliwe jest przestrzeganie zasad RESTful z akcjami wsadowymi i nadal mieć akceptowalną wydajność.