¿Por qué debería eliminar usando HTTP POST o DELETE, en lugar de GET?

He estado trabajando a través de los tutoriales ASP.NET MVC de Microsoft, terminando en esta página

http://www.asp.net/learn/mvc/tutorial-32-cs.aspx

La siguiente statement se realiza hacia el final de esta página:

En general, no desea realizar una operación HTTP GET al invocar una acción que modifique el estado de su aplicación web. Al realizar una eliminación, desea realizar una POST HTTP o, mejor aún, una operación HTTP DELETE.

¿Es esto cierto? ¿Alguien puede ofrecer una explicación más detallada de la razón de esta afirmación?

Editar

Wikipedia dice lo siguiente:

Algunos métodos (por ejemplo, HEAD, GET, OPTIONS y TRACE) se definen como seguros, lo que significa que están destinados solo a la recuperación de información y no deben cambiar el estado del servidor.

Por el contrario, métodos como POST, PUT y DELETE están destinados a acciones que pueden causar efectos secundarios en el servidor

La respuesta de Jon Skeet es la respuesta canónica. Pero: supongamos que tienes un enlace:

href = "\myApp\DeleteImportantData.aspx?UserID=27" 

y el google-bot aparece e indexa tu página? ¿Qué pasa entonces?

GET está convencionalmente libre de efectos secundarios, en otras palabras, no cambia el estado. Eso significa que los resultados se pueden almacenar en caché, los marcadores se pueden hacer con seguridad, etc.

Desde el HTTP 1.1 RFC 2616

Los implementadores deben ser conscientes de que el software representa al usuario en sus interacciones a través de Internet, y deben tener cuidado de permitir que el usuario esté al tanto de cualquier acción que puedan tomar que pueda tener un significado inesperado para ellos mismos o para otros.

En particular, se ha establecido la convención de que los métodos GET y HEAD NO DEBEN tener la importancia de tomar una acción que no sea la recuperación. Estos métodos deben considerarse “seguros”. Esto permite a los agentes de usuario representar otros métodos, como POST, PUT y DELETE, de manera especial, para que el usuario sepa que se está solicitando una acción posiblemente insegura.

Naturalmente, no es posible garantizar que el servidor no genere efectos secundarios como resultado de realizar una solicitud GET; de hecho, algunos recursos dynamics consideran esa característica. La distinción importante aquí es que el usuario no solicitó los efectos secundarios, por lo que no puede responsabilizarse por ellos.

Además de los problemas puristas en torno a ser idempotente, hay un lado práctico: las arañas / bots / rastreadores, etc. seguirán hipervínculos. Si tiene su acción de “eliminar” como un hipervínculo que hace un GET, entonces Google puede borrar alegremente todos sus datos. Ver ” La araña de la perdición “.

Con publicaciones, esto no es un riesgo.

Por favor mira mi respuesta aquí . Se aplica igualmente a esta pregunta.

  • Prefetch: muchos navegadores web usarán la captación previa. Lo que significa que cargará una página antes de hacer clic en el enlace. Anticipando que harás clic en ese enlace más adelante.
  • Bots: hay varios bots que escanean e indexan Internet para obtener información. Solo emitirán solicitudes GET. No desea eliminar algo de una solicitud GET por este motivo.
  • Almacenamiento en caché: GET Las solicitudes HTTP no deben cambiar de estado y deben ser idempotentes. Idempotente significa que emitir una solicitud una vez o emitirla varias veces da el mismo resultado. Es decir, no hay efectos secundarios. Por esta razón, las solicitudes HTTP GET están estrechamente vinculadas al almacenamiento en caché.
  • El estándar HTTP lo dice : el estándar HTTP dice para qué sirve cada método HTTP. Varios progtwigs están diseñados para usar el estándar HTTP, y suponen que lo usará de la forma en que se supone que debe hacerlo. Entonces, si no sigue, tendrá un comportamiento indefinido de una serie de progtwigs aleatorios.

Otro ejemplo..

 http://example.com/admin/articles/delete/2 

Esto eliminará el artículo si ha iniciado sesión y tiene los privilegios correctos. Si su sitio acepta comentarios, por ejemplo, un usuario envía ese enlace como una imagen; al igual que:

 This will delete your article. 

Luego, cuando usted mismo, como usuario administrador, navegue a través de los comentarios en su sitio, el navegador intentará obtener esa imagen enviando una solicitud a esa URL. Pero debido a que está conectado mientras el navegador está haciendo esto, el artículo será eliminado.

Puede que ni siquiera lo note, sin mirar el código fuente, ya que la mayoría de los navegadores no mostrarán nada si no puede encontrar una imagen.

Espero que tenga sentido.

Además de arañas y solicitudes que tienen que ser idempotentes, también hay un problema de seguridad con las solicitudes de obtención. Alguien puede enviar fácilmente a sus usuarios un correo electrónico con

  

en el texto y el navegador estará de acuerdo y tratará de acceder al recurso. Usar POST no es una cura para tales cosas (ya que puedes armar una publicación de formulario en JavaScript con bastante facilidad), pero es un buen comienzo.

Sobre este tema (uso de métodos HTTP), recomiendo leer esta publicación del blog: http://blog.codevader.com/2008/11/02/why-learning-http-does-matter/

Este es realmente el problema opuesto: por qué no usar POST cuando no se cambian datos.

Otro problema con GET es que el comando va a la barra de direcciones del navegador. Por lo tanto, si actualiza la página, emite el comando nuevamente, ya sea “eliminar lo último”, “enviar el pedido” o similar.

Digamos que tenemos una aplicación de banca por Internet y visitamos la página de transferencia. El usuario que ha iniciado sesión elige transferir $ 10 a otra cuenta.

Al hacer clic en el botón Enviar se redirige (como una solicitud GET) a https://my.bank.com/users/transfer?amount=10&destination=23lk3j2kj31lk2j3k2j

Pero la conexión a Internet es lenta y / o el / los servidor (es) está (n) ocupado (s) así que después de presionar el botón de enviar, la página nueva se carga lentamente.

El usuario se frustra y comienza a golpear furiosamente F5 (página de actualización). Adivina que pasará? Más de una transferencia ocurrirá posiblemente vaciando la cuenta del usuario.


Ahora bien, si la solicitud se realiza como POST (o cualquier otra cosa que GET), la primera F5 (página de actualización) que el usuario hará, el navegador le preguntará suavemente “¿está seguro de que quiere hacer eso? Puede tener efectos secundarios [bla bla bla] ] … ”