rest - reciente - Manera relajante para eliminar un grupo de elementos
como pausar el historial de google (6)
En el artículo de wiki para REST se indica que si usa http://example.com/resources DELETE, significa que está eliminando la colección completa.
Si usa http://example.com/resources/7HOU57Y SUPRIMIR, eso significa que está eliminando ese elemento.
Estoy haciendo un SITIO WEB, tenga en cuenta NO SERVICIO WEB.
Tengo una lista que tiene 1 casilla de verificación para cada artículo en la lista. Una vez que selecciono varios elementos para su eliminación, les permitiré a los usuarios presionar un botón llamado DELETE SELECTION. Si el usuario presiona el botón, aparecerá un cuadro de diálogo js pidiéndole al usuario que confirme la eliminación. si el usuario confirma, todos los elementos se eliminan.
Entonces, ¿cómo debo atender para eliminar múltiples elementos de una manera RESTANTE?
NOTA, actualmente para DELETE en una página web, lo que hago es usar la etiqueta FORM con POST como acción pero incluir un método con el valor DELETE, ya que esto es lo que otros indicaron en SO sobre cómo hacer RESTful delete para la página web .
Como no hay una forma "adecuada" de hacer esto, lo que hice en el pasado es:
envíe DELETE a http://example.com/something con datos codificados xml o json en el cuerpo.
cuando reciba la solicitud, marque BORRAR, si es verdadero, luego lea el cuerpo para los que se eliminarán.
Creo que la respuesta de Rojaca es la mejor hasta ahora. Una ligera variación podría ser eliminar la confirmación de javascript en la misma página y, en lugar de eso, crear la selección y redirigir a ella, mostrando un mensaje de confirmación en esa página. En otras palabras:
De:
http://example.com/resources/
haz una
POST con una selección de los ID para:
http://example.com/resources/selections
que, si tiene éxito, debería responder con:
HTTP / 1.1 201 creado, y un encabezado de Ubicación para:
http://example.com/resources/selections/DF4XY7
En esta página, verá un cuadro de confirmación (javascript) que, si confirma, hará una solicitud de:
ELIMINA http://example.com/resources/selections/DF4XY7
que, si tiene éxito, debe responder con: HTTP / 1.1 200 Ok (o lo que sea apropiado para una eliminación exitosa)
Curiosamente, creo que se aplica el mismo método que PATCHING a varias entidades, y requiere pensar en lo que queremos decir con nuestra URL, parámetros y método REST.
devolver todos los elementos ''foo'':
[GET] api/foo
devuelve elementos ''foo'' con filtrado para identificadores específicos:
[GET] api/foo?ids=3,5,9
Donde el sentido es que la URL y el filtro determinan "¿con qué elementos estamos tratando?", Y el método REST (en este caso "GET") dice "¿qué hacer con esos elementos?"
Por lo tanto, PATCH múltiples registros para marcarlos como leídos
[PATCH] api/foo?ids=3,5,9
..con los datos foo [leer] = 1
Finalmente para eliminar múltiples registros, este punto final es más lógico:
[DELETE] api/foo?ids=3,5,9
Por favor, comprenda que no creo que haya "reglas" sobre esto, para mí solo "tiene sentido"
Esto es lo que hizo Amazon con su API S3 REST.
Solicitud de eliminación individual:
DELETE /ObjectName HTTP/1.1
Host: BucketName.s3.amazonaws.com
Date: date
Content-Length: length
Authorization: authorization string (see Authenticating Requests (AWS Signature Version 4))
Solicitud de eliminación de múltiples objetos :
POST /?delete HTTP/1.1
Host: bucketname.s3.amazonaws.com
Authorization: authorization string
Content-Length: Size
Content-MD5: MD5
<?xml version="1.0" encoding="UTF-8"?>
<Delete>
<Quiet>true</Quiet>
<Object>
<Key>Key</Key>
<VersionId>VersionId</VersionId>
</Object>
<Object>
<Key>Key</Key>
</Object>
...
</Delete>
Pero la API Graph de Facebook , la API REST de Parse Server y la API REST de Google Drive van aún más allá, ya que le permiten "agrupar" operaciones individuales en una sola solicitud.
Aquí hay un ejemplo de Parse Server.
Solicitud de eliminación individual:
curl -X DELETE /
-H "X-Parse-Application-Id: ${APPLICATION_ID}" /
-H "X-Parse-REST-API-Key: ${REST_API_KEY}" /
https://api.parse.com/1/classes/GameScore/Ed1nuqPvcm
Solicitud de lote:
curl -X POST /
-H "X-Parse-Application-Id: ${APPLICATION_ID}" /
-H "X-Parse-REST-API-Key: ${REST_API_KEY}" /
-H "Content-Type: application/json" /
-d ''{
"requests": [
{
"method": "POST",
"path": "/1/classes/GameScore",
"body": {
"score": 1337,
"playerName": "Sean Plott"
}
},
{
"method": "POST",
"path": "/1/classes/GameScore",
"body": {
"score": 1338,
"playerName": "ZeroCool"
}
}
]
}'' /
https://api.parse.com/1/batch
Una opción es crear una "transacción" de eliminación. Por lo tanto, puede POST
algo como http://example.com/resources/deletes
un nuevo recurso que consiste en una lista de recursos para eliminar. Luego, en su aplicación, simplemente haga la eliminación. Cuando realice la publicación, debe devolver una ubicación de su transacción creada, por ejemplo, http://example.com/resources/deletes/DF4XY7
. Un GET
en este podría devolver el estado de la transacción (completa o en progreso) y / o una lista de recursos que se eliminarán.
Yo diría que DELETE http://example.com/resources/id1,id2,id3,id4 o DELETE http://example.com/resources/id1+id2+id3+id4 . Como "REST es un protocolo de arquitectura (...) [no]" para citar este artículo de la wikipedia, creo que no hay una sola forma de hacerlo.
Soy consciente de que lo anterior no es posible sin JS con HTML, pero tengo la sensación de que REST fue:
- Creado sin pensar en detalles menores como transacciones. ¿Quién necesitaría operar en más de un solo artículo? Esto de alguna manera está justificado en el protocolo HTTP, ya que no estaba destinado a servir a través de nada más que las páginas web estáticas.
- No es necesario ajustarse bien a los modelos actuales, incluso de HTML puro.