¿Cuál es la forma REST-ful de eliminar varios elementos?
Mi caso de uso es que tengo una colección Backbone en la que necesito poder eliminar varios elementos a la vez. Las opciones parecen ser:
- Envíe una solicitud DELETE para cada registro (lo que parece una mala idea si hay potencialmente docenas de elementos);
- Envíe un DELETE donde los ID a eliminar están encadenados en la URL (es decir, "/ registros / 1; 2; 3");
- De forma que no sea REST, envíe un objeto JSON personalizado que contenga los ID marcados para su eliminación.
Todas las opciones son menos que ideales.
Esto parece un área gris de la convención REST.
api
rest
backbone.js
Donald Taylor
fuente
fuente
Respuestas:
/records/1;2;3
”. Por lo tanto, una respuesta 2xx a esto puede hacer que eliminen su caché/records/1;2;3
; no purgar/records/1
,/records/2
o/records/3
; proxy una respuesta 410 para/records/1;2;3
, u otras cosas que no tienen sentido desde su punto de vista.records=[1,2,3]
to/delete-requests
) y sondear el recurso creado (especificado por elLocation
encabezado de la respuesta) para averiguar si su solicitud ha sido aceptada, rechazada o está en curso. o ha completado. Esto es útil para operaciones de larga duración. Otra forma es enviar unaPATCH
solicitud al recurso de lista ,/records
, cuyo cuerpo contiene una lista de recursos y acciones para realizar en esos recursos (en el formato que desee admitir). Esto es útil para operaciones rápidas donde el código de respuesta para la solicitud puede indicar el resultado de la operación.Todo se puede lograr mientras se mantiene dentro de las limitaciones de REST, y normalmente la respuesta es convertir el "problema" en un recurso y darle una URL.
Por lo tanto, las operaciones por lotes, como eliminar aquí o POSTAR varios elementos en una lista, o realizar la misma edición en una franja de recursos, se pueden manejar creando una lista de "operaciones por lotes" y POSTANDO su nueva operación en ella.
No lo olvide, REST no es la única forma de resolver ningún problema. "REST" es solo un estilo arquitectónico y no tiene que adherirse a él (pero pierde ciertos beneficios de Internet si no lo hace). Le sugiero que consulte esta lista de arquitecturas de API HTTP y elija la que más le convenga. Solo sea consciente de lo que pierde si elige otra arquitectura y tome una decisión informada basada en su caso de uso.
¿Hay algunas malas respuestas a esta pregunta sobre patrones para manejar operaciones por lotes en servicios web REST? que tienen demasiados votos a favor, pero también deben leerse.
fuente
DELETE
solicitud, todo lo que se encuentre entre el solicitante y el servidor pensará que se está eliminando un solo recurso, en la URL especificada. Las cadenas de consulta son partes opacas de la URL para estos dispositivos, por lo que no importa cómo especifique su API, no están al tanto de este conocimiento, por lo que no pueden comportarse de manera diferente.DELETE
está prohibido pasar un cuerpo de solicitud con una solicitud. No lo hagas. Si lo hace, me comeré a sus hijos. NOM Nom Nom.Si
GET /records?filteringCriteria
devuelve una matriz de todos los registros que coinciden con los criterios,DELETE /records?filteringCriteria
podría eliminar todos esos registros.En este caso, la respuesta a su pregunta sería
DELETE /records?id=1&id=2&id=3
.fuente
GET /records?id=1&id=2&id=3
no no significa “sacar los tres registros con identificadores 1, 2 y 3”, que significa “sacar el único recurso con la ruta URL / registros? id = 1 & id = 2 & id = 3”, que podría ser una imagen de un nabo, un texto sin formato documento que contiene el número "42" en chino, o puede que no exista./records?id=1
y/records?id=2
, y sus respuestas se almacenan en caché por algún intermediario (por ejemplo, su navegador o ISP). Si Internet supiera lo que su aplicación quería decir con esto, entonces es lógico que/records?id=1&id=2
la caché pueda devolver una solicitud de simplemente fusionando (de alguna manera) los dos resultados que ya tiene, sin tener que preguntar al servidor de origen. Pero esto no es posible./records?id=1&id=2
puede no ser válido (solo se permite 1 identificación por solicitud) o puede devolver algo completamente diferente (un nabo).id[]=1&id[]=2
oid=1&id=2
en la cadena de consulta para representar una matriz de valores, esa cadena de consulta representa precisamente eso. Y creo que es una práctica muy común y buena que la cadena de consulta represente un filtro. Además, si permite eliminaciones y actualizaciones, no almacene lasGET
solicitudes en caché . Si lo hace, los clientes mantendrán un estado obsoleto.Creo que Mozilla Storage Service SyncStorage API v1.5 es una buena manera de eliminar varios registros usando REST.
Elimina una colección completa.
Elimina varios BSO de una colección con una sola solicitud.
ids : elimina los BSO de la colección cuyos identificadores se encuentran en la lista separada por comas proporcionada. Se puede proporcionar un máximo de 100 ID.
Elimina la BSO en la ubicación indicada.
http://moz-services-docs.readthedocs.io/en/latest/storage/apis-1.5.html#api-instructions
fuente
Sí, hasta ahora solo me he encontrado con una guía de diseño de API REST que menciona operaciones por lotes (como una eliminación por lotes): la guía de diseño de API de Google .
Esta guía menciona la creación de métodos "personalizados" que se pueden asociar a través de un recurso usando dos puntos, por ejemplo
https://service.name/v1/some/resource/name:customVerb
, también menciona explícitamente las operaciones por lotes como caso de uso:Entonces, podría hacer lo siguiente de acuerdo con la guía de API de Google:
... para eliminar un montón de elementos de su recurso de colección.
fuente
If the HTTP verb used for the custom method does not accept an HTTP request body (GET, DELETE), the HTTP configuration of such method must not use the body clause at all,
en el capítulo Método personalizado. Pero laGET accounts.locations.batchGet
API es el método GET con body. Eso es raro. developers.google.com/my-business/reference/rest/v4/…POST
usa un método http y solo se nombra el método personalizadobatchGet
. Supongo que Google lo hace para (a) ceñirse a su regla de que todos los métodos personalizados deben serPOST
(consulte mi respuesta) y (b) para facilitar que las personas pongan un "filtro" en el cuerpo para que usted no tenga que hacerlo escape o codifique el filtro como con las cadenas de consulta. la desventaja, por supuesto, es que esto ya no se puedehttps://service.name/v1/some/resource/name:customVerb
no es RESTful por definición.Permití un reemplazo total de una colección, por ejemplo,
PUT ~/people/123/shoes
donde el cuerpo es la representación de la colección completa.Esto funciona para colecciones de elementos de niños pequeños en las que el cliente quiere revisar los elementos y eliminar algunos y agregar otros y luego actualizar el servidor. Podrían PONER una colección vacía para borrar todo.
Esto significaría
GET ~/people/123/shoes/9
que aún permanecería en el caché a pesar de que un PUT lo eliminó, pero eso es solo un problema de almacenamiento en caché y sería un problema si otra persona eliminara el zapato.Mis API de datos / sistemas siempre usan ETag en lugar de tiempos de caducidad, por lo que el servidor recibe cada solicitud y necesito encabezados de versión / concurrencia correctos para mutar los datos. Para las API que son de solo lectura y alineadas con vistas / informes, utilizo tiempos de vencimiento para reducir las visitas al origen, por ejemplo, una tabla de clasificación puede ser válida durante 10 minutos.
Para colecciones mucho más grandes, por ejemplo
~/people
, no suelo necesitar una eliminación múltiple, el caso de uso tiende a no surgir de forma natural y, por lo tanto, un DELETE único funciona bien.En el futuro, y de la experiencia con la creación de API REST y con los mismos problemas y requisitos, como auditoría, me inclinaría a usar solo verbos GET y POST y diseñar en torno a eventos, por ejemplo, POST un evento de cambio de dirección, aunque sospecho que vendrá con su propio conjunto de problemas :)
También permitiría a los desarrolladores de front-end crear sus propias API que consuman API de back-end más estrictas, ya que a menudo existen razones prácticas y válidas del lado del cliente por las que no les gustan los diseños de API REST estrictos "Fielding fanáticos", y para la productividad y razones de capas de caché.
fuente