En una solicitud HTTP GET , los parámetros se envían como una cadena de consulta :
http://example.com/page ? parameter = value & also = another
En una solicitud HTTP POST , los parámetros no se envían junto con el URI.
¿Dónde están los valores? En el encabezado de la solicitud? En el cuerpo de la solicitud? Cómo se ve?

multipart/form-data. Sin embargo, para aquellos interesados, aquí hay una pregunta al respecto .multipart/form-datao si está a cargo de la construcción de la solicitud, cambiar el tipo de contenidoapplication/jsony pegar el texto json en el cuerpo http directamenteEl contenido se coloca después de los encabezados HTTP. El formato de una POST HTTP es tener los encabezados HTTP, seguidos de una línea en blanco, seguida del cuerpo de la solicitud. Las variables POST se almacenan como pares clave-valor en el cuerpo.
Puede ver esto en el contenido sin formato de una publicación HTTP, que se muestra a continuación:
Puede ver esto usando una herramienta como Fiddler , que puede usar para ver la carga de solicitud y respuesta HTTP sin procesar que se envía a través del cable.
fuente
application/x-www-form-urlencoded, que no siempre es el caso.Fromencabezado allí?Fromencabezado. OMI está ahí arriba con el código de estado 418 HTTP.Respuesta corta: en las solicitudes POST, los valores se envían en el "cuerpo" de la solicitud. Con los formularios web, lo más probable es que se envíen con un tipo de medio de
application/x-www-form-urlencodedomultipart/form-data. Los lenguajes de programación o marcos que han sido diseñados para manejar las peticiones web por lo general hacer "la cosa correcta ™" con tales peticiones y le proporcionará un acceso fácil a los valores decodificados fácilmente (como$_REQUESTo$_POSTen PHP, ocgi.FieldStorage(),flask.request.formen Python).Ahora pasemos un poco, lo que puede ayudar a entender la diferencia;)
La diferencia entre
GETy lasPOSTsolicitudes son en gran medida semánticas. También se "usan" de manera diferente, lo que explica la diferencia en cómo se pasan los valores.GET ( sección RFC relevante )
Al ejecutar una
GETsolicitud, le pide al servidor una o un conjunto de entidades. Para permitir que el cliente filtre el resultado, puede usar la llamada "cadena de consulta" de la URL. La cadena de consulta es la parte después de?. Esto es parte de la sintaxis de URI .Por lo tanto, desde el punto de vista del código de su aplicación (la parte que recibe la solicitud), deberá inspeccionar la parte de consulta URI para obtener acceso a estos valores.
Tenga en cuenta que las claves y los valores son parte del URI. Los navegadores pueden imponer un límite en la longitud de URI. El estándar HTTP establece que no hay límite. Pero en el momento de escribir estas líneas, la mayoría de los navegadores no limitan los URI (no tengo valores específicos).
GETlas solicitudes nunca deben usarse para enviar nueva información al servidor. Especialmente no documentos más grandes. Ahí es donde debes usarPOSToPUT.POST ( sección RFC relevante )
Al ejecutar una
POSTsolicitud, el cliente está enviando un nuevo documento al host remoto. Por lo tanto, una cadena de consulta no tiene sentido (semánticamente). Es por eso que no tiene acceso a ellos en su código de aplicación.POSTes un poco más complejo (y mucho más flexible):Al recibir una solicitud POST, siempre debe esperar una "carga útil" o, en términos HTTP: un cuerpo de mensaje . El cuerpo del mensaje en sí mismo es bastante inútil, ya que no hay un formato estándar (por lo que puedo decir. ¿Tal vez aplicación / octeto-flujo?). El formato del cuerpo está definido por el
Content-Typeencabezado. Cuando se usa unFORMelemento HTML conmethod="POST", esto suele serapplication/x-www-form-urlencoded. Otro tipo muy común es multipart / form-data si usa cargas de archivos. Pero podría ser cualquier cosa , desdetext/plain, másapplication/jsono incluso una costumbreapplication/octet-stream.En cualquier caso, si se realiza una
POSTsolicitud con unaContent-Typeque no puede ser manejada por la aplicación, debe devolver un415código de estado .La mayoría de los lenguajes de programación (y / o marcos web) ofrecen una forma de descodificar / codificar el cuerpo del mensaje de / a los tipos más comunes (como
application/x-www-form-urlencoded,multipart/form-dataoapplication/json). Entonces eso es fácil. Los tipos personalizados requieren potencialmente un poco más de trabajo.Usando un documento codificado estándar de formulario HTML como ejemplo, la aplicación debe realizar los siguientes pasos:
Content-Typecampo415código de estadoUna vez más, los lenguajes como PHP o los marcos web para otros lenguajes populares probablemente lo manejarán por usted. La excepción a esto es el
415error. Ningún marco puede predecir qué tipos de contenido elige admitir y / o no admitir su aplicación. Esto depende de ti.PUT ( sección RFC relevante )
Una
PUTsolicitud se maneja de la misma manera que unaPOSTsolicitud. La gran diferencia es quePOSTse supone que una solicitud permite que el servidor decida cómo (y si es que lo hace) crear un nuevo recurso. Históricamente (a partir del ahora obsoleto RFC2616 fue crear un nuevo recurso como "subordinado" (hijo) del URI al que se envió la solicitud).En
PUTcambio, se supone que una solicitud "deposita" un recurso exactamente en ese URI y con exactamente ese contenido. Ni mas ni menos. La idea es que el cliente sea responsable de crear el recurso completo antes de "PONERLO". El servidor debe aceptar que tal y como está en la URL dada.Como consecuencia, una
POSTsolicitud generalmente no se usa para reemplazar un recurso existente. UnaPUTsolicitud puede crear y reemplazar.Nota al margen
También hay " parámetros de ruta " que se pueden usar para enviar datos adicionales al control remoto, pero son tan poco comunes que no voy a entrar en demasiados detalles aquí. Pero, como referencia, aquí hay un extracto del RFC:
fuente
PUTsección, verás que es idempotente.POSTen contraste puede, por definición, no ser.POSTsiempre creará un nuevo recurso.PUTserá, si existe un recurso idéntico reemplazarlo. Entonces, si llamasPOST10 veces, crearás 10 recursos. Si llamaPUT10 veces, (quizás) creará solo una. Eso responde tu pregunta?No puede escribirlo directamente en la barra de URL del navegador.
Puede ver cómo se envían los datos POST en Internet con Live HTTP Headers, por ejemplo. El resultado será algo así
En donde dice
serán los valores publicados.
fuente
Content-Lengthsupone que debe estar29aquí? Esa es la longitud real de la cuerdausername=zurfyx&pass=password.El tipo de medio predeterminado en una solicitud POST es
application/x-www-form-urlencoded. Este es un formato para codificar pares clave-valor. Las claves pueden ser duplicadas. Cada par clave-valor está separado por un&carácter, y cada clave está separada de su valor por un=carácter.Por ejemplo:
Está codificado como:
Esto se coloca en el cuerpo de la solicitud después de los encabezados HTTP.
fuente
Los valores de formulario en HTTP POST se envían en el cuerpo de la solicitud, en el mismo formato que la cadena de consulta.
Para más información, consulte las especificaciones .
fuente
?por ejemplo?application/x-www-form-urlencoded, que no siempre es el caso.Algunos de los servicios web requieren que coloque los datos y metadatos de la solicitud por separado. Por ejemplo, una función remota puede esperar que la cadena de metadatos firmada se incluya en un URI, mientras que los datos se publican en un cuerpo HTTP.
La solicitud POST puede verse semánticamente así:
Este enfoque combina lógicamente QueryString y Body-Post utilizando un único
Content-Typeque es una "instrucción de análisis" para un servidor web.Tenga en cuenta: HTTP / 1.1 está envuelto con el
#32(espacio) a la izquierda y con#10(Avance de línea) a la derecha.fuente
/user/johny/?user=johnes meramente semántica (HTTP realmente no da un tratamiento especial a las cadenas de consulta), por lo que considero que esto es razonablemente esperado. Pero, ¿qué quieres decir con "envuelto por el espacio a la izquierda"? No hay espacios antes del método HTTP. ¿Te refieres a la línea en blanco para el cuerpo de la publicación?...Ym04yHTTP/1.1en el código anterior. Entonces, un QueryString simplemente reside entre el verbo y la versión del protocolo.?misma manera que lo hacemos con lasGETsolicitudes.En primer lugar, diferenciemos entre
GETyPOSTObtener: es la
HTTPsolicitud predeterminada que se realiza al servidor y se utiliza para recuperar los datos del servidor y la cadena de consulta que viene después?de aURIse utiliza para recuperar un recurso único.este es el formato
Aquí
data=valueestá el valor de cadena de consulta pasado.POST: se utiliza para enviar datos al servidor de forma segura, por lo que cualquier cosa que se necesite, este es el formato de una
POSTsolicitud¿Por qué publicar en GET?
En
GETel valor que se envía a los servidores generalmente se agrega a la URL base en la cadena de consulta, ahora hay 2 consecuencias de estoGETsolicitudes se guardan en el historial del navegador con los parámetros. Por lo tanto, sus contraseñas permanecen sin cifrar en el historial del navegador. Este era un problema real para Facebook en aquellos días.URIpuede durar. Si se envían demasiados parámetros, es posible que reciba414 Error - URI too longEn caso de una solicitud posterior, sus datos de los campos se agregan al cuerpo. La longitud de los parámetros de solicitud se calcula y se agrega al encabezado para la longitud del contenido y no se agregan datos importantes directamente a la URL.
Puede utilizar la sección de red de Herramientas para desarrolladores de Google para ver información básica sobre cómo se realizan las solicitudes a los servidores.
y siempre se puede añadir más valores en el
Request HeaderscomoCache-Control,Origin,Accept.fuente
HTTPSconexión, noHTTP.HTTPScifra tanto elURL(incluidos los parámetros de consulta) como elRequest Body, cuando noHTTPcifra ni protege ninguno. El problema descrito proviene del hecho de que muchos navegadores almacenan elURIs(incluidoURLs) en sus bases de datos de historial (generalmente no encriptado). Por lo tanto, use solo elRequest Body+HTTPSpara cualquier cosa sensible.