Su lenguaje, " Parece muy derrochador ...", para mí indica un intento de optimización prematura. A menos que se pueda demostrar que enviar la representación completa de los objetos es un gran impacto en el rendimiento (estamos hablando de que los usuarios son inaceptables> 150 ms), entonces no tiene sentido intentar crear un nuevo comportamiento API no estándar. Recuerde, cuanto más simple es la API, más fácil es usarla.
Para las eliminaciones, envíe lo siguiente ya que el servidor no necesita saber nada sobre el estado del objeto antes de que ocurra la eliminación.
DELETE /emails
POSTDATA: [{id:1},{id:2}]
El siguiente pensamiento es que si una aplicación se encuentra con problemas de rendimiento con respecto a la actualización masiva de objetos, se debe considerar dividir cada objeto en varios objetos. De esa forma, la carga útil de JSON es una fracción del tamaño.
Como ejemplo, al enviar una respuesta para actualizar los estados de "lectura" y "archivado" de dos correos electrónicos separados, deberá enviar lo siguiente:
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"]
}
]
Separaría los componentes mutables del correo electrónico (leído, archivado, importancia, etiquetas) en un objeto separado, ya que los otros (para, desde, asunto, texto) nunca se actualizarían.
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"]}
]
Otro enfoque a tomar es aprovechar el uso de un PATCH. Para indicar explícitamente qué propiedades tiene la intención de actualizar y que todos los demás deben ignorarse.
PATCH /emails
POSTDATA: [
{
id:1,
read:true,
archived:true
},
{
id:2,
read:true,
archived:false
}
]
Las personas afirman que PATCH debe implementarse proporcionando una serie de cambios que contengan: acción (CRUD), ruta (URL) y cambio de valor. Esto puede considerarse una implementación estándar, pero si observa la totalidad de una API REST, es una aplicación no intuitiva. Además, la implementación anterior es cómo GitHub ha implementado PATCH .
En resumen, es posible adherirse a los principios RESTful con acciones por lotes y aún tener un rendimiento aceptable.