2010-10-08 22 views
5

Sé que quiero saber qué sucede detrás de la escena de un método de publicación HTTP. es decir, el navegador envía una solicitud de publicación HTTP a un script del lado del servidor en PHP (por ejemplo).¿Cómo se implementa el método http post?

¿Cómo la variable $ _POST de PHP obtiene los valores del cliente.

¿Podría alguien explicar en detalle o señalar una guía?

Respuesta

1

El navegador codifica los datos de acuerdo con la content-type of the form, a continuación, la transmite como el cuerpo de una solicitud POST. PHP luego lo recoge y rellena $_POST con los nombres y valores (realizando un manejo especial cuando el nombre incluye los caracteres [ y ] o .).

+0

para qué sirve.) – abel

+0

Lo convierte en '_' – Quentin

+0

Convierte' .' en '_' (por razones históricas, solía ser que cada variable en el formulario se convertía en una variable real. Google para" register_globals "para detalles sobre esa última parte). – cHao

0

Sugiero que obtenga un proxy de captura (por ejemplo, Fiddler) o una herramienta de captura de red (por ejemplo, Wireshark) y mire su propio tráfico de navegación por un tiempo; le dará una buena vista del problema.

Aparte de eso, POST es bastante similar a GET, excepto que los datos se envían en el cuerpo de la solicitud en lugar de la URL, y hay dos maneras de codificarlos (multipart-form-data además del urlencode que se comparte con GET)

+0

Hay algunas formas de trabajar con * formularios * en un navegador, pero los POST XHR pueden (y generalmente lo hacen) usar JSON, XML, etc. en lugar de codificar en url o multipart/form-data. Por supuesto, generalmente debe leer los datos POST y decodificarlos usted mismo. – cHao

4

El protocolo HTTP (*) especifica cómo el navegador debe enviar la solicitud.

HTTP consiste básicamente en un conjunto de encabezados en texto sin formato, separados por alimentaciones de línea, seguidos por los datos que se transmiten. Dentro de la solicitud HTTP, los datos POST en realidad tienen el mismo formato que los datos GET; solo está en una parte diferente de los encabezados HTTP.

Puede usar herramientas como Firebug o Fiddler para ver exactamente cómo se formatean los encabezados y los datos para las solicitudes HTTP entrantes y salientes. En realidad, es bastante simple de leer, por lo que debería poder resolverlo solo con mirar.

Una vez que llega al servidor, el intérprete de PHP es responsable de traducir los datos de solicitud HTTP sin procesar a sus variables estándar $ _GET, $ _POST, etc. Esto es algo que PHP hace por ti.

Otros idiomas (por ejemplo, Perl) no tienen esta funcionalidad incorporada, por lo que un programador de Perl debería tener código en su programa para analizar los datos de la solicitud entrante en variables útiles. Afortunadamente, incluso Perl tiene una biblioteca estándar que se puede incluir que hace el trabajo, por lo que incluso los programadores de Perl generalmente no tienen que escribir el código ellos mismos más.

La forma en que PHP y cualquier otro lenguaje lo hace es simplemente manipulación de cadenas. Como ya he dicho, los datos HTTP son texto plano y se reciben en formato de cadena simple, por lo que solo se trata de dividirlos en signos de interrogación e iguales.

Como PHP lo hace todo detrás de las escenas, probablemente no tenga que preocuparse por los mecanismos exactos que utiliza, pero el código fuente de PHP está disponible si realmente desea averiguarlo.

Dije que todo está en texto sin formato. HTTPS, por supuesto, está encriptado. Sin embargo, cuando PHP se apodera de él, el servidor Apache ya ha realizado el descifrado, por lo que, en lo que respecta a PHP, sigue siendo texto sin formato.

(*) Antes de que alguien me explique, sí, sé que decir "protocolo HTTP" es una redundancia, como "cajero automático" o "número PIN".

+1

En cuanto a las redundancias, ¿qué pasa con "$ _GET, $ _POST variables"? Lo último que verifiqué, cualquier palabra que comience con $ es una variable por definición ... :) (Oye, lo pediste) – cHao

+0

@cHao - jeje. Sí, creo que sí. :) – Spudley

0

Bueno, vamos a ilustrar paso a paso, empezando con una página que contiene una [acción de formulario = método de "foo.php" = "post"]

vez que haga clic submit (o pulsa enter), el navegador lo hará desencadenar un evento llamado "enviar". Este evento se puede atrapar internamente para el procesamiento con javascript/dom, y esto es lo que hacen la mayoría de los sitios para la validación o las rutinas Ajax.

Si las rutinas no detienen el flujo con un resultado falso, el navegador continúa procesando la solicitud de envío (este proceso es lo mismo que realizar una publicación con el objeto XMLHttpRequest).

El navegador comprobará el primer método, la acción y la codificación del contenido, luego analizará los valores de las entradas para conocer el tamaño de los datos que enviará y codificarlos.

Finalmente enviar algo como esto (valores en bruto):

POST /foo.php HTTP/1.1 
Host: example.org 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 7 

foo=bar 

Ésta es una solicitud POST. Pero tenga en cuenta que puede enviar contenido de longitud y enviar variables en fragmentos. El navegador y el servidor saben que esto puede suceder (este es el propósito del método POST). Cuando un servidor recibe una solicitud POST, sigue escuchando el navegador hasta que el contenido recibido coincida con la longitud del contenido informado.

Ahora el otro lado. El servidor recibe la solicitud, escucha el contenido, lo analiza (foo = bar; xxx = baz) y lo pone a disposición en su entorno para esa solicitud específica, por lo que puede capturarlo con PHP o Python, o Java ...

Eso es todo. ¡Ah, tenga en cuenta que puede pasar tanto las variables GET como POST en la misma solicitud!

El uso de un [acción de formulario = "foo.php? Somevar = 123 & anotherVar = TRUE" method = "post"]

hará que el navegador envía la solicitud como

POST /foo.php?someVar=123&anotherVar=TRUE HTTP/1.1 
Host: example.org 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 7 

foo=bar 

y el servidor al analizar esta solicitud hará que las siguientes variables disponibles:

  • GET [somevar] = 123
  • GET [anotherVar] = VERDADERO
  • POST [foo] = barra