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-data
o si está a cargo de la construcción de la solicitud, cambiar el tipo de contenidoapplication/json
y 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.From
encabezado allí?From
encabezado. 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-urlencoded
omultipart/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$_REQUEST
o$_POST
en PHP, ocgi.FieldStorage()
,flask.request.form
en Python).Ahora pasemos un poco, lo que puede ayudar a entender la diferencia;)
La diferencia entre
GET
y lasPOST
solicitudes 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
GET
solicitud, 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).
GET
las solicitudes nunca deben usarse para enviar nueva información al servidor. Especialmente no documentos más grandes. Ahí es donde debes usarPOST
oPUT
.POST ( sección RFC relevante )
Al ejecutar una
POST
solicitud, 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.POST
es 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-Type
encabezado. Cuando se usa unFORM
elemento 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/json
o incluso una costumbreapplication/octet-stream
.En cualquier caso, si se realiza una
POST
solicitud con unaContent-Type
que no puede ser manejada por la aplicación, debe devolver un415
có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-data
oapplication/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-Type
campo415
có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
415
error. 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
PUT
solicitud se maneja de la misma manera que unaPOST
solicitud. La gran diferencia es quePOST
se 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
PUT
cambio, 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
POST
solicitud generalmente no se usa para reemplazar un recurso existente. UnaPUT
solicitud 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
PUT
sección, verás que es idempotente.POST
en contraste puede, por definición, no ser.POST
siempre creará un nuevo recurso.PUT
será, si existe un recurso idéntico reemplazarlo. Entonces, si llamasPOST
10 veces, crearás 10 recursos. Si llamaPUT
10 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-Length
supone que debe estar29
aquí? 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-Type
que 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/john
y/?user=john
es 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?...Ym04
yHTTP/1.1
en el código anterior. Entonces, un QueryString simplemente reside entre el verbo y la versión del protocolo.?
misma manera que lo hacemos con lasGET
solicitudes.En primer lugar, diferenciemos entre
GET
yPOST
Obtener: es la
HTTP
solicitud 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 aURI
se utiliza para recuperar un recurso único.este es el formato
Aquí
data=value
está 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
POST
solicitud¿Por qué publicar en GET?
En
GET
el 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 estoGET
solicitudes 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.URI
puede durar. Si se envían demasiados parámetros, es posible que reciba414 Error - URI too long
En 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 Headers
comoCache-Control
,Origin
,Accept
.fuente
HTTPS
conexión, noHTTP
.HTTPS
cifra tanto elURL
(incluidos los parámetros de consulta) como elRequest Body
, cuando noHTTP
cifra 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
+HTTPS
para cualquier cosa sensible.