¿Cuáles son las ventajas de usar una solicitud GET sobre una solicitud POST?


Varias de mis aplicaciones ajax en el pasado han utilizado GET request, pero ahora estoy empezando a usar POST request en su lugar. Las solicitudes de PUBLICACIÓN parecen ser un poco más seguras y definitivamente más amigables/bonitas con las url. Por lo tanto, me pregunto si hay alguna razón por la que debería usar GET request en absoluto.

Author: Md. Abu Nafee Ibna Zahid, 2008-10-12

7 answers

Generalmente configuré la pregunta de la siguiente manera: ¿Cambia algo importante después de la solicitud? (No obstante el registro y similares). Si lo hace, debe ser una solicitud POST, si no lo hace, debe ser una solicitud GET.

Me alegro de que llames a las solicitudes POST "ligeramente" más seguras, porque eso es más o menos lo que son; es trivial falsificar una solicitud POST de un usuario a una página. Sin embargo, al hacerlo una solicitud POSTERIOR, evita que los aceleradores web o las recargas vuelvan a activar el acción accidental.

Como AJAX, hay una consideración más: si está devolviendo JSON con soporte de devolución de llamada, tenga mucho cuidado de no poner ningún dato confidencial que no desee que otros sitios web puedan ver allí. Wikipedia tenía una vulnerabilidad a lo largo de estas líneas donde el usuario anti-CSRF token fue revelado a través de su API JSON.

 23
Author: Edward Z. Yang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-12 07:58:33

Debe usar GET donde está haciendo una solicitud que no tiene efectos secundarios, por ejemplo, solo obtener información. Esta solicitud puede:

  • Repetirse sin ningún problema-si el navegador detecta un error puede reintentar en silencio
  • Tiene su resultado almacenado en caché por el navegador
  • Ser cacheado por un proxy

Todas estas cosas son buenas. Cualquier cosa que solo esté recuperando datos (particularmente datos públicos) debería ser realmente un GET. El servidor debe enviar sensible Last-Modified: y Caduca: encabezados para permitir el almacenamiento en caché si es necesario.

 14
Author: MarkR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-12 07:57:52

Todos los puntos buenos, sin embargo, en respuesta a la pregunta, las solicitudes GET son más útiles en ciertos escenarios que las solicitudes POST:

  1. Pueden ser marcados
  2. Se pueden almacenar en caché
  3. Son más rápidos
  4. Tienen consecuencias conocidas (suponiendo que no cambian los datos), por lo que visitarlos múltiples el tiempo no es un problema.

Por el bien de la posteridad, la actualización de este comentario con las notas del blog re: punto #3 aquí, todo el crédito a Omar AL Zabir (el autor de la entrada de blog referenciada ):

"Atlas por defecto hace HTTP POST para todas las llamadas AJAX. Http POST es más caro que Http GET. Transmite más bytes a través del cable, tomando así tiempo precioso de la red y también hace ASP.NET hacer extra procesamiento en el extremo del servidor. Por lo tanto, debe usar Http Get tanto como posible. Sin embargo, Http Get no le permite pasar objetos como parámetros. Puede pasar numérica, cadena y fecha solamente. Cuando haces una llamada Http Get, Atlas construye una url codificada y hace un hit a eso URL. Por lo tanto, no debe pasar demasiado contenido que hace que la url se convierta en mayor que 2048 caracteres. Que yo sepa, eso es lo máximo longitud de cualquier url.

Otra cosa malvada sobre http post es que en realidad son 2 llamadas. Primero el navegador envía los encabezados http post y las respuestas del servidor con " HTTP 100 Continuar". Cuando el navegador recibe esto, envía el cuerpo real."

 10
Author: jvenema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-01 23:39:19

Esto podría ayudarte a decidir dónde usar GET y dónde usar POST:

URI, Direccionabilidad, y el uso de HTTP GET y POST .

 8
Author: CMS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-12 07:54:14

Hay otra diferencia no mencionada por nadie.

Las solicitudes GET se pasan en la cadena URL y, por lo tanto, están sujetas a un límite de longitud que generalmente depende del navegador.

Las solicitudes POST pueden ser mucho más grandes - de hecho no están limitadas realmente. Entonces, si necesita solicitar datos de un servidor web y está pasando mucha información de parámetros, entonces una solicitud POST podría ser la única opción.

Entonces, como se mencionó antes, realmente una solicitud GET es para solicitar datos (sin efectos secundarios) mientras que una solicitud POSTERIOR generalmente se usa para transmitir datos al servidor para almacenarlos (con efectos secundarios). por ejemplo, utilice POST para cargar un archivo. Consigue recuperar un archivo.

Hubo un tiempo en que IE creo que tenía una cadena de URL GET muy corta. Algunas aplicaciones como Lotus notes usan grandes números de caracteres aleatorios para representar ID de documento. Tuve el disgusto de usar otro producto que generaba cadenas aleatorias para que la URL de la página fuera única cada vez. La cadena aleatoria era enorme... y no siempre funcionó con IE6 de memoria.

 7
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-20 03:54:56

Las solicitudes POST son tan inseguras como GETs. La principal diferencia es que POST se utiliza para modificar el estado de la aplicación de servidor, mientras que GET solo solicita datos de ella.

La diferencia importa cuando se usan URLs limpias, "restful", donde la propia URL especifica el recurso, y los diferentes métodos desencadenan diferentes acciones en el lado del servidor.

 6
Author: noid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-12 07:58:52

Quizás lo más importante es que GET se puede marcar / ver en el historial de url y se puede buscar en Google.

POST es importante cuando no quieres que el evento sea marcable o que se pueda escribir como una URL; de lo contrario, tú (o Google rastreando tus URL) podrías terminar accidentalmente haciendo cosas como eliminar usuarios de tu sistema, por ejemplo.

 4
Author: HoboBen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-12 07:57:30