Bahasa Anda, " Sepertinya sangat boros ...", bagi saya menunjukkan upaya optimasi prematur. Kecuali dapat ditunjukkan bahwa mengirimkan seluruh representasi objek adalah hit kinerja utama (kita berbicara tidak dapat diterima pengguna sebagai> 150 ms) maka tidak ada gunanya mencoba membuat perilaku API non-standar yang baru. Ingat, semakin sederhana API, semakin mudah digunakan.
Untuk menghapus, kirim yang berikut karena server tidak perlu tahu apa-apa tentang keadaan objek sebelum penghapusan terjadi.
DELETE /emails
POSTDATA: [{id:1},{id:2}]
Pikiran berikutnya adalah bahwa jika suatu aplikasi mengalami masalah kinerja mengenai pembaruan massal objek maka pertimbangan memecah setiap objek menjadi beberapa objek harus diberikan. Dengan begitu muatan JSON adalah sebagian kecil dari ukuran.
Sebagai contoh ketika mengirim respons untuk memperbarui status "baca" dan "diarsipkan" dari dua email terpisah, Anda harus mengirim yang berikut:
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"]
}
]
Saya akan membagi komponen email yang dapat diubah (baca, diarsipkan, penting, label) menjadi objek terpisah karena yang lain (agar, dari, subjek, teks) tidak akan pernah diperbarui.
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"]}
]
Pendekatan lain yang harus diambil adalah memanfaatkan penggunaan PATCH. Untuk secara eksplisit menunjukkan properti yang ingin Anda perbarui dan yang lainnya harus diabaikan.
PATCH /emails
POSTDATA: [
{
id:1,
read:true,
archived:true
},
{
id:2,
read:true,
archived:false
}
]
Orang-orang menyatakan bahwa PATCH harus diimplementasikan dengan memberikan berbagai perubahan yang mengandung: action (CRUD), path (URL), dan perubahan nilai. Ini dapat dianggap sebagai implementasi standar tetapi jika Anda melihat keseluruhan REST API, ini adalah non-intuitif sekali saja. Juga, implementasi di atas adalah bagaimana GitHub telah mengimplementasikan PATCH .
Singkatnya, dimungkinkan untuk mematuhi prinsip RESTful dengan aksi batch dan masih memiliki kinerja yang dapat diterima.