¿Cuándo usas POST y cuándo usas GET?

Por lo que puedo deducir, hay tres categorías:

  1. Nunca use GET y use POST
  2. Nunca use POST y use GET
  3. No importa cuál uses.

¿Estoy en lo cierto al asumir esos tres casos? Si es así, ¿cuáles son algunos ejemplos de cada caso?

Use POST para acciones destructivas como la creación (soy consciente de la ironía), la edición y la eliminación, porque no puede ejecutar una acción POST en la barra de direcciones de su navegador. Use GET cuando sea seguro permitir que una persona llame a una acción. Entonces una URL como:

 http://myblog.org/admin/posts/delete/357 

Debe llevarlo a una página de confirmación, en lugar de simplemente eliminar el elemento. Es mucho más fácil evitar accidentes de esta manera.

POST también es más seguro que GET , porque no está pegando información en una URL. Por lo tanto, usar GET como method para un formulario HTML que recostack una contraseña u otra información confidencial no es la mejor idea.

Una nota final: POST puede transmitir una cantidad de información mayor que GET . ‘POST’ no tiene restricciones de tamaño para los datos transmitidos, mientras que ‘GET’ está limitado a 2048 caracteres.

En breve

  • Use GET para solicitudes safe and idempotent
  • Use POST para POST neither safe nor idempotent

En detalles Hay un lugar apropiado para cada uno. Incluso si no sigue los principios RESTful , se puede obtener mucho aprendiendo sobre REST y cómo funciona un enfoque orientado a recursos.

Una aplicación RESTful use GETs para operaciones que son tanto safe and idempotent .

Una operación safe es una operación que not change the data solicitados.

Una operación idempotent es aquella en la que el resultado será be the same sin importar cuántas veces lo solicite.

Es lógico que, como los GET se usan para operaciones seguras , también son automáticamente idempotentes . Normalmente, un GET se utiliza para recuperar un recurso (una pregunta y sus respuestas asociadas en el desbordamiento de la stack, por ejemplo) o una colección de recursos.

Una aplicación RESTful usará PUTs para operaciones que not safe but idempotent son not safe but idempotent .

Sé que la pregunta era sobre GET y POST, pero volveré a POST en un segundo.

Normalmente, un PUT se usa para editar un recurso (por ejemplo, editar una pregunta o una respuesta en el desbordamiento de la stack).

Un POST se usaría para cualquier operación que neither safe or idempotent .

Típicamente, un POST se usaría para crear un nuevo recurso, por ejemplo, creando una pregunta NUEVA (aunque en algunos diseños también se usaría PUT para esto).

Si ejecuta el POST dos veces, terminaría creando DOS nuevas preguntas.

También hay una operación de ELIMINACIÓN, pero supongo que puedo dejar eso allí 🙂

Discusión

En términos prácticos, los navegadores web modernos generalmente solo admiten GET y POST de forma confiable (puede realizar todas estas operaciones a través de llamadas javascript, pero en términos de ingresar datos en formularios y presionar enviar generalmente tiene las dos opciones). En una aplicación RESTful, el POST a menudo será anulado para proporcionar también las llamadas PUT y DELETE.

Pero, incluso si no está siguiendo los principios RESTful, puede ser útil pensar en términos de usar GET para recuperar / ver información y POST para crear / editar información.

Nunca debe usar GET para una operación que altere datos. Si un motor de búsqueda rastrea un enlace a su operación malvada, o los marcadores del cliente, podría significar un gran problema.

Use GET si no le importa que la solicitud se repita (es decir, no cambia de estado).

Use POST si la operación cambia el estado del sistema.

Version corta

GET: normalmente se utiliza para solicitudes de búsqueda enviadas, o cualquier solicitud en la que desee que el usuario pueda volver a abrir la página exacta.

Ventajas de GET:

  • Las URL se pueden marcar de manera segura.
  • Las páginas se pueden volver a cargar de forma segura.

Desventajas de GET:

  • Las variables se pasan a través de url como pares nombre-valor. (Riesgo de seguridad)
  • Número limitado de variables que pueden pasarse. (Basado en el navegador. Por ejemplo, Internet Explorer está limitado a 2.048 caracteres ) .

POST: se usa para solicitudes de mayor seguridad donde los datos pueden usarse para alterar una base de datos, o una página que no desea que alguien marque como favorito.

Ventajas de POST:

  • Los pares nombre-valor no se muestran en url. (Seguridad + = 1)
  • Se puede pasar un número ilimitado de pares de nombre-valor a través de POST. Referencia.

Desventajas de POST:

  • La página que usó datos POST no puede ser marcador. (Si así lo desea)

Versión más larga

Directamente del Protocolo de transferencia de hipertexto – HTTP / 1.1 :

9.3 GET

El método GET significa recuperar cualquier información (en forma de una entidad) identificada por Request-URI. Si el URI de solicitud se refiere a un proceso de producción de datos, son los datos producidos los que se devolverán como la entidad en la respuesta y no el texto fuente del proceso, a menos que ese texto sea el resultado del proceso.

La semántica del método GET cambia a un “GET condicional” si el mensaje de solicitud incluye un campo de encabezado If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match o If-Range. Un método GET condicional solicita que la entidad se transfiera solo en las circunstancias descritas por los campos de encabezado condicional (es). El método condicional GET tiene como objective reducir el uso innecesario de la red al permitir que las entidades en caché se actualicen sin requerir múltiples solicitudes o transferir datos que ya posee el cliente.

La semántica del método GET cambia a un “GET parcial” si el mensaje de solicitud incluye un campo de encabezado Rango. Un GET parcial solicita que solo se transfiera parte de la entidad, como se describe en la sección 14.35. El método parcial GET tiene la intención de reducir el uso innecesario de la red al permitir que entidades parcialmente recuperadas se completen sin transferir datos que ya posee el cliente.

La respuesta a una solicitud GET es almacenable en caché solo si cumple con los requisitos para el almacenamiento en caché HTTP descrito en la sección 13.

Consulte la sección 15.1.3 para consideraciones de seguridad cuando se usa para formularios.

9.5 POST

El método POST se utiliza para solicitar que el servidor de origen acepte la entidad incluida en la solicitud como un nuevo subordinado del recurso identificado por el URI de solicitud en la línea de solicitud. POST está diseñado para permitir un método uniforme para cubrir las siguientes funciones:

  • Anotación de recursos existentes;

  • Publicar un mensaje en un tablero de anuncios, un grupo de noticias, una lista de correo o un grupo similar de artículos;

  • Proporcionar un bloque de datos, como el resultado de enviar un formulario, a un proceso de manejo de datos;

  • Extender una base de datos a través de una operación de agregar.

La función real realizada por el método POST está determinada por el servidor y generalmente depende del Request-URI. La entidad publicada está subordinada a ese URI de la misma manera que un archivo está subordinado a un directorio que lo contiene, un artículo de noticias está subordinado a un grupo de noticias al que se publica, o un registro está subordinado a una base de datos.

La acción realizada por el método POST podría no dar como resultado un recurso que pueda identificarse mediante un URI. En este caso, 200 (OK) o 204 (Sin contenido) es el estado de respuesta apropiado, dependiendo de si la respuesta incluye o no una entidad que describa el resultado.

Lo primero importante es el significado de GET versus POST:

  • GET debe usarse para … obtener … cierta información del servidor,
  • mientras que POST debería usarse para enviar información al servidor.

Después de eso, un par de cosas que se pueden notar:

  • Con GET, los usuarios pueden usar el botón “Atrás” en su navegador, y pueden marcar páginas
  • Hay un límite en el tamaño de los parámetros que puede aprobar como GET (2 KB para algunas versiones de Internet Explorer, si no me equivoco) ; el límite es mucho más para POST, y generalmente depende de la configuración del servidor.

De todos modos, no creo que podamos “vivir” sin GET: piense en cuántas URL está usando con parámetros en la cadena de consulta, todos los días, sin GET, no funcionarían 😉

Además de la diferencia de restricciones de longitud en muchos navegadores web, también existe una diferencia semántica. Se supone que los GET son “seguros” en el sentido de que son operaciones de solo lectura que no cambian el estado del servidor. Los POST generalmente cambiarán de estado y darán advertencias al volver a enviarlos. Los rastreadores web de los motores de búsqueda pueden hacer GET pero nunca deben realizar POST.

Use GET si desea leer datos sin cambiar el estado y use POST si desea actualizar el estado en el servidor.

Mi regla general es utilizar Get cuando realiza solicitudes al servidor que no van a alterar el estado. Las publicaciones se reservan para las solicitudes al servidor que alteran el estado.

Una diferencia práctica es que los navegadores y los servidores web tienen un límite en la cantidad de caracteres que pueden existir en una URL. Es diferente de la aplicación a la aplicación, pero es posible golpearlo si tienes textarea en tus formularios.

Otro problema con los GET: son indexados por los motores de búsqueda y otros sistemas automáticos. Google una vez tuvo un producto que preseleccionaba enlaces en la página que estaba viendo, por lo que sería más rápido cargarlos si hacía clic en esos enlaces. Causó grandes esgulps en los sitios que tenían enlaces como delete.php?id=1 – las personas perdieron sus sitios enteros.

Use GET cuando desee que la URL refleje el estado de la página. Esto es útil para ver páginas generadas dinámicamente, como las que se ven aquí. Se debe usar un POST en un formulario para enviar datos, como cuando hago clic en el botón “Publicar su respuesta”. También produce una URL más limpia ya que no genera una cadena de parámetros después de la ruta.

Debido a que los GET son puramente URL, el navegador web los puede almacenar en caché y se pueden usar mejor para cosas como imágenes generadas consistentemente. (Establecer un tiempo de caducidad)

Un ejemplo de la página de Gravatar: http://www.gravatar.com/avatar/4c3be63a4c2f539b013787725dfce802?d=monsterid

GET puede arrojar un rendimiento marginalmente mejor, algunos servidores web escriben contenidos POST en un archivo temporal antes de invocar al controlador.

Otra cosa a considerar es el límite de tamaño. Los GET están limitados por el tamaño de la URL, 1024 bytes por estándar, aunque los navegadores pueden admitir más.

La transferencia de más datos que eso debería usar un POST para obtener una mejor compatibilidad del navegador.

Incluso menos que ese límite es un problema, como escribió otro afiche, cualquier cosa en la URL podría terminar en otras partes de la interfaz de usuario del navegador, como el historial.

No hay nada que no puedas hacer per se. El punto es que no debes modificar el estado del servidor en un HTTP GET. Los proxies HTTP asumen que dado que HTTP GET no modifica el estado, entonces si un usuario invoca HTTP GET una vez o 1000 veces no hace diferencia. Al usar esta información, asumen que es seguro devolver una versión almacenada en caché del primer HTTP GET. Si rompe la especificación HTTP corre el riesgo de romper el cliente HTTP y los proxies en la naturaleza. No lo hagas 🙂

Esto atraviesa el concepto de REST y cómo la web fue pensada para ser utilizada. Hay un excelente podcast en la radio de Ingeniería de Software que brinda una charla en profundidad sobre el uso de Get y Post.

Get se utiliza para extraer datos del servidor, donde una acción de actualización no debería ser necesaria. La idea es que debería poder utilizar la misma solicitud GET una y otra vez y obtener la misma información. La URL tiene la información de obtención en la cadena de consulta, ya que se suponía que podía enviarse fácilmente a otros sistemas y a las personas, como una dirección en donde encontrar algo.

Se supone que la publicación debe ser utilizada (al menos por la architecture REST en la que se basa la web) para enviar información al servidor / diciéndole al servidor que realice una acción. Ejemplos como: actualizar esta información, crear este registro.

1.3 Lista de verificación rápida para elegir HTTP GET o POST

Use GET si:

  The interaction is more like a question (ie, it is a safe operation such as a query, read operation, or lookup). 

Use POST si:

  The interaction is more like an order, or The interaction changes the state of the resource in a way that the user would perceive (eg, a subscription to a service), or The user be held accountable for the results of the interaction. 

Fuente

no veo ningún problema al usar get, lo uso para cosas simples donde tiene sentido mantener las cosas en la cadena de consulta.

Usarlo para actualizar el estado, como un GET de delete.php?id=5 para eliminar una página, es muy arriesgado. La gente lo descubrió cuando el acelerador web de Google comenzó a captar previamente las URL en las páginas: tocó todos los enlaces de ‘eliminar’ y anuló los datos de las personas. Lo mismo puede pasar con las arañas de los motores de búsqueda.

POST puede mover datos grandes mientras que GET no puede.

Pero, en general, no se trata de una falla de GET, sino de una convención si desea que su sitio web / aplicación web se comporte bien.

Eche un vistazo a http://www.w3.org/2001/tag/doc/whenToUseGet.html

De RFC 2616 :

9.3 GET
El método GET significa recuperar cualquier información (en forma de una entidad) identificada por Request-URI. Si el URI de solicitud se refiere a un proceso de producción de datos, son los datos producidos los que se devolverán como la entidad en la respuesta y no el texto fuente del proceso, a menos que ese texto sea el resultado del proceso.

9.5 POST
El método POST se utiliza para solicitar que el servidor de origen acepte la entidad incluida en la solicitud como un nuevo subordinado del recurso identificado por el URI de solicitud en la línea de solicitud. POST está diseñado para permitir un método uniforme para cubrir las siguientes funciones:

  • Anotación de recursos existentes;
  • Publicar un mensaje en un tablero de anuncios, un grupo de noticias, una lista de correo o un grupo similar de artículos;
  • Proporcionar un bloque de datos, como el resultado de enviar un formulario, a un proceso de manejo de datos;
  • Extender una base de datos a través de una operación de agregar.

La función real realizada por el método POST está determinada por el servidor y generalmente depende del Request-URI. La entidad publicada está subordinada a ese URI de la misma manera que un archivo está subordinado a un directorio que lo contiene, un artículo de noticias está subordinado a un grupo de noticias al que se publica, o un registro está subordinado a una base de datos.

La acción realizada por el método POST podría no dar como resultado un recurso que pueda identificarse mediante un URI. En este caso, 200 (OK) o 204 (Sin contenido) es el estado de respuesta apropiado, dependiendo de si la respuesta incluye o no una entidad que describa el resultado.

GET y POST básicamente permiten que la información se envíe de vuelta al servidor web desde un navegador (u otro cliente HTTP para el caso).

Imagine que tiene un formulario en una página HTML y haciendo clic en el botón “enviar” envía los datos en el formulario nuevamente al servidor, como pares “nombre = valor”.

Al elegir GET como el “método” se agregarán todos los datos a la URL y se mostrarán en la barra de URL de su navegador. La cantidad de información que puede enviar utilizando un GET está restringida, ya que las URL solo pueden tener 1024 caracteres.

Los desafíos de la integración en la nube Descargar ahora Un POST por otro lado (normalmente) enviará la información a través de un socket al servidor web y no aparecerá en la barra de URL. Puede enviar mucha más información al servidor de esta manera, y no está restringido a datos textuales tampoco. ¡Es posible enviar archivos e incluso datos binarios, como objetos Java serializados!

La intención original era que GET se usara para recuperar datos y que POST fuera cualquier cosa. La regla de oro que uso es que si envío algo al servidor, uso POST. Si solo estoy llamando a una URL para recuperar datos, uso GET.

Lea el artículo sobre HTTP en la Wikipedia . Explicará qué es el protocolo y qué hace:

OBTENER

Solicita una representación del recurso especificado. Tenga en cuenta que GET no debe usarse para operaciones que causan efectos secundarios, como su uso para realizar acciones en aplicaciones web. Una razón para esto es que GET puede ser usado arbitrariamente por robots o rastreadores, que no deberían tener que considerar los efectos secundarios que una solicitud debería causar.

y

POST Envía datos para ser procesados ​​(por ejemplo, desde un formulario HTML) al recurso identificado. Los datos están incluidos en el cuerpo de la solicitud. Esto puede dar como resultado la creación de un nuevo recurso o las actualizaciones de los recursos existentes o ambos.

El W3C tiene un documento llamado URI, direccionabilidad y el uso de HTTP GET y POST que explica cuándo usar qué. Citando

1.3 Lista de verificación rápida para elegir HTTP GET o POST

  • Use GET si:
    • La interacción es más como una pregunta (es decir, es una operación segura, como una consulta, operación de lectura o búsqueda).

y

  • Use POST si:
    • La interacción es más como una orden, o
    • La interacción cambia el estado del recurso de una manera que el usuario perciba (por ejemplo, una suscripción a un servicio), o o El usuario debe rendir cuentas por los resultados de la interacción.

Sin embargo, antes de la decisión final de utilizar HTTP GET o POST, tenga en cuenta consideraciones sobre datos confidenciales y consideraciones prácticas.

Un ejemplo práctico sería cada vez que envíe un formulario HTML. Especifique una publicación u obtenga para la acción de formulario. PHP completará $ _GET y $ _POST en consecuencia.

En PHP, el límite de datos POST generalmente lo establece tu php.ini . GET está limitado por la configuración del servidor / navegador, creo, generalmente alrededor de 255 bytes.

Uso POST cuando no quiero que la gente vea QueryString o cuando QueryString se agranda. Además, se necesita POST para subir archivos.

Sin embargo, no veo problemas para usar GET, lo uso para cosas simples donde tiene sentido mantener las cosas en QueryString.

Usar GET permitirá también vincular a una página en particular donde POST no funcionaría.

Versión simple de POST GET PUT DELETE use GET – cuando desee obtener cualquier recurso como List of data basado en cualquier Id o Name use POST – cuando desee enviar datos al servidor. tenga en cuenta POST es una operación de gran peso porque para la actualización deberíamos usar PUT en lugar de POST internamente POST creará un nuevo uso de recursos PUT – cuando

De w3schools.com :

¿Qué es HTTP?

El Protocolo de transferencia de hipertexto (HTTP) está diseñado para habilitar las comunicaciones entre clientes y servidores.

HTTP funciona como un protocolo de solicitud y respuesta entre un cliente y un servidor.

Un navegador web puede ser el cliente, y una aplicación en una computadora que aloja un sitio web puede ser el servidor.

Ejemplo: un cliente (navegador) envía una solicitud HTTP al servidor; luego el servidor devuelve una respuesta al cliente. La respuesta contiene información de estado sobre la solicitud y también puede contener el contenido solicitado.

Dos métodos de solicitud HTTP: GET y POST

Dos métodos comúnmente utilizados para una solicitud-respuesta entre un cliente y un servidor son: GET y POST.

GET – Solicita datos de un recurso especificado POST – Envía los datos para ser procesados ​​a un recurso especificado

Aquí distinguimos las principales diferencias:

enter image description here

Bueno, una cosa importante es que todo lo que envíes a través de GET será expuesto a través de la URL. En segundo lugar, como dice Ceejayoz, hay un límite en los caracteres para una URL.

Otra diferencia es que POST generalmente requiere dos operaciones HTTP, mientras que GET solo requiere una.

Edición: debo aclarar, para los patrones de progtwigción comunes. En general, responder a un POST con una página HTML directa es un diseño cuestionable por una variedad de razones, una de las cuales es la molesta “debe volver a enviar este formulario, ¿desea hacerlo?” al presionar el botón Atrás.

Como respondieron otros, hay un límite en el tamaño de la URL con get, y los archivos pueden enviarse solo con publicación.

Me gustaría agregar que uno puede agregar cosas a una base de datos con un get y realizar acciones con una publicación. Cuando un script recibe una publicación o un get, puede hacer lo que el autor quiera que haga. Creo que la falta de comprensión proviene de la redacción que eligió el libro o de cómo lo leíste.

Un autor de guiones debería usar publicaciones para cambiar la base de datos y usar get solo para recuperar información.

Los lenguajes de scripting proporcionan muchos medios para acceder a la solicitud. Por ejemplo, PHP permite el uso de $_REQUEST para recuperar una publicación o un get. Uno debe evitar esto a favor de $_GET o $_POST más específicos.

En la progtwigción web, hay mucho más espacio para la interpretación. Hay lo que uno debería y lo que uno puede hacer, pero cuál es mejor a menudo es tema de debate. Afortunadamente, en este caso, no hay ambigüedad. Debe usar las publicaciones para cambiar los datos, y debe usar get para recuperar información.

Gorgapor, mod_rewrite todavía utiliza a menudo GET . Solo permite traducir una URL más amigable a una URL con una cadena de consulta GET .

Los datos de HTTP Post no tienen un límite específico en la cantidad de datos, mientras que los diferentes navegadores tienen límites diferentes para los GET. El RFC 2068 establece:

Los servidores deben tener cuidado al no depender de longitudes de URI superiores a 255 bytes, ya que es posible que algunas implementaciones de cliente o proxy anteriores no sean compatibles con estas longitudes

Específicamente, debería utilizar las construcciones HTTP adecuadas para lo que se utilizan. HTTP GET no debe tener efectos secundarios y puede actualizarse y almacenarse de manera segura mediante HTTP Proxies, etc.

Los POST de HTTP se utilizan cuando desea enviar datos contra un recurso de url.

Un ejemplo típico para usar HTTP GET es en una búsqueda, es decir, búsqueda? Query = my + query Un ejemplo típico para usar HTTP POST es enviar comentarios a un formulario en línea.