La especificación clave para describir una solicitud HTTP es RFC 7230, “Protocolo de transferencia de hipertexto (HTTP / 1.1): sintaxis y enrutamiento de mensajes”. El formato del mensaje se define en la sección 3 de este documento.
Una solicitud HTTP es un caso de un mensaje HTTP general (la respuesta HTTP es la otra), que consiste en:
- Una línea de inicio , terminada por un par de avance de línea de retorno de carro (CRLF).
- Opcionalmente, una o más líneas de encabezado , cada una terminada por un par CRLF.
- Una línea en blanco (un par CRLF por sí mismo).
- Opcionalmente, un cuerpo del mensaje .
La línea de inicio de la solicitud HTTP contiene tres elementos, separados por espacios:
- ¿Qué infraestructura de servidor se requiere para servir 5 millones de páginas vistas por día?
- ¿Cuál es la mejor manera de aprender cómo configurar un servidor Amazon EC2?
- ¿Es un servidor un dispositivo o un código de software?
- ¿Hay algún servidor de chat XMPP que admita el historial de chat como gmail [Detalles a continuación]?
- ¿Alguien necesita un servidor dedicado para obtener bitcoin?
- El método de solicitud , o “verbo” para la solicitud.
- El objetivo de la solicitud , que indica en qué se debe operar.
- El nombre y la versión del protocolo, en este caso, “HTTP / 1.1”.
El método de solicitud más común es GET, que recupera el contenido de una página. El siguiente más común es POST, que es utilizado por “formularios” en una página web para enviar datos al servidor. Hay varios menos comunes.
El objetivo de la solicitud suele ser un URI especificado en relación con la “raíz” del sitio, para indicar a qué recurso acceder.
Las líneas de encabezado tienen la forma “palabra clave: valor”. Se utilizan para especificar varios “parámetros” para la solicitud, como qué tipo de contenido le gustaría recuperar al cliente, qué tipo de cuerpo del mensaje (si lo hay) se está enviando, etc.
El cuerpo del mensaje puede ser cualquier dato requerido como parte del mensaje. Su formato y longitud generalmente se especifican por Tipo de contenido : y Longitud de contenido: encabezados. Las solicitudes GET no usan un cuerpo de mensaje, por lo que solo terminan después de la línea en blanco que sigue a los encabezados. Las solicitudes POST generalmente contienen los datos del formulario enviados por el navegador, codificados como “name1 = value1 & name2 = value2 & …”.
Aquí hay un ejemplo de una solicitud HTTP utilizada para recuperar la página de inicio de mi servidor web:
GET / HTTP / 1.1 Anfitrión: erbosoft .com Conexión: mantener vivo Control de caché: max-age = 0 Aceptar: text / html, application / xhtml + xml, application / xml; q = 0.9, image / webp, * / *; q = 0.8 User-Agent: Mozilla / 5.0 (X11; Linux x86_64) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 38.0.2125.104 Safari / 537.36 Aceptar-codificación: gzip, desinflar, sdch Idioma de aceptación: en-US, en; q = 0.8 If-Modified-Since: mar, 07 feb 2012 04:44:06 GMT
( Nota: el espacio adicional entre “erbosoft” y “.com” es necesario para falsificar el analizador de URL de Quora. No estaba presente en la solicitud original. La línea en blanco adicional al final de la solicitud también se omite).
La primera línea le dice al servidor que estamos pidiendo su página “raíz” (eso es lo que significa “/”). La mayoría de los servidores web interpretan la ruta URI como una ruta de directorio relativa a algún “directorio raíz web” y, si la ruta resultante identifica un directorio, busque un archivo en ese directorio llamado “index.html” y envíelo. El host: el encabezado le dice que estamos pidiendo un nombre de host en particular; Los servidores web pueden servir páginas para múltiples hosts, así es como el servidor lo distingue.
La conexión: el encabezado keep-alive le dice al servidor: “No cierre la conexión después de enviarnos este archivo, probablemente tengamos más cosas que pedirle”. El encabezado Cache-Control: max-age = 0 dice que no queremos una copia en caché; Queremos uno nuevo.
Los diversos encabezados de “aceptación” le dicen al servidor exactamente qué tipo y formato de contenido queremos buscar. Sin entrar en demasiados detalles, el navegador dice que preferiría recibir texto HTML o XHTML (el Aceptar: encabezado), puede usar ciertos métodos de codificación para reducir el tamaño del contenido para la transmisión (el Aceptar-Codificar: encabezado), y preferiría recibir texto en inglés de EE. UU., aunque el inglés normal estaría bien (el idioma de aceptación: encabezado).
La complicada cadena de texto enviada en el User-Agent: encabezado identifica el navegador exactamente, con todo tipo de texto de “compatibilidad” incluido, por lo que si el servidor cuenta con ver otro tipo de navegador, no se asustará. El navegador, en este caso, es Chrome, aunque también se identifica con cadenas para Mozilla, Apple WebKit, KHTML, Gecko y Safari. También le dice al servidor que el navegador se ejecuta bajo el sistema de ventanas X11 en una máquina Linux de 64 bits.
El encabezado If-Modified-Since: le dice al servidor: “Ya recuperé una copia de esta página web en este momento. Si no ha cambiado desde entonces, solo dígame eso en lugar de enviarlo todo otra vez.”
El servidor tomará todo esto y enviará una respuesta apropiada.
Punta de sombrero: Daniel catalán para la A2A.