peticiones - Estrategia de eliminación RESTful
rest para dummies (5)
Por qué no? Ya está pasando un parámetro para identificar qué recurso, así que envíe otro para establecer un curso de acción diferente. OMI, es perfectamente RESTful.
Digamos que tengo un recurso que puede tener dos comportamientos diferentes cuando se llama eliminar
- El recurso es eliminado.
- El recurso se mueve a la papelera de reciclaje.
¿Cómo lo modelaría de una manera compatible con REST?
Pensé en la siguiente solución:
DELETE /myresource
mueve el recurso a la papelera de reciclaje (comportamiento predeterminado)
DELETE /myresource?force-delete=true
fuerzas eliminar en el recurso.
¿Es eso REST obediente? Nunca he visto parámetros de consulta en la URL al llamar a DELETE, ¿está bien?
Una estrategia REST pura debería preferir recursos no cambiantes. En mi opinión, no está cambiando el recurso agregando un parámetro, por lo que me parece una buena estrategia.
Si tuviera que realizar la misma acción de esta manera:
DELETE /myresource.force
eso actuaría como otro recurso, que no sería óptimo.
Tu idea está bien, pero creo que un encabezado de solicitud personalizado sería un poco más apropiado. Los parámetros de consulta son más adecuados para, bueno, los parámetros.
Un encabezado de solicitud personalizado se vería así:
DELETE /myresource
X-Really-Delete: Yup
También puede implementar 2. como una solicitud POST en lugar de BORRAR.
POST /myresource
recycle-bin=true...
Como todo lo que estás haciendo es actualizar el recurso para indicar que está en la papelera de reciclaje.
EDITAR : el método cambiado de PUT
a POST
dado un PUT
debe incluir un reemplazo completo (o agregado) del recurso, mientras que claramente aquí solo estamos actualizando una parte del recurso.
BORRAR debería eliminar el elemento, sin preguntas.
Lamentablemente, no hay una solicitud ''MOVE'' en HTTP. POST suele ser para crear contenido, PUT es más modificaciones.
Así que le sugiero que haga algo como PUT /myresource
con algún tipo de metadato o una cadena json en la línea de { "recycle":"true" }
para indicar que quiere ''reciclarla''.