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
o multipart/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, o cgi.FieldStorage()
, flask.request.form
en Python).
Ahora pasemos un poco, lo que puede ayudar a entender la diferencia;)
La diferencia entre GET
y las POST
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.
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 usar POST
o PUT
.
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 un FORM
elemento HTML con method="POST"
, esto suele ser application/x-www-form-urlencoded
. Otro tipo muy común es multipart / form-data si usa cargas de archivos. Pero podría ser cualquier cosa , desde text/plain
, más application/json
o incluso una costumbre application/octet-stream
.
En cualquier caso, si se realiza una POST
solicitud con una Content-Type
que no puede ser manejada por la aplicación, debe devolver un 415
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
o application/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:
- Lee el
Content-Type
campo
- Si el valor no es uno de los tipos de medios admitidos, devuelva una respuesta con un
415
código de estado
- de lo contrario, decodifique los valores del cuerpo del mensaje.
Una 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.
Una PUT
solicitud se maneja de la misma manera que una POST
solicitud. La gran diferencia es que POST
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. Una PUT
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:
Además de los segmentos de puntos en las rutas jerárquicas, la sintaxis genérica considera que un segmento de ruta es opaco. Las aplicaciones que producen URI a menudo usan los caracteres reservados permitidos en un segmento para delimitar subcomponentes específicos del esquema o del controlador de referencia. Por ejemplo, los caracteres reservados con punto y coma (";") e igual ("=") a menudo se usan para delimitar parámetros y valores de parámetros aplicables a ese segmento. El carácter reservado con coma (",") se utiliza a menudo para fines similares. Por ejemplo, un productor de URI podría usar un segmento como "nombre; v = 1.1" para indicar una referencia a la versión 1.1 de "nombre", mientras que otro podría usar un segmento como "nombre, 1.1" para indicar lo mismo. Los tipos de parámetros pueden definirse por una semántica específica del esquema,
multipart/form-data
. Sin embargo, para aquellos interesados, aquí hay una pregunta al respecto .