Protocolo de transferencia de hipertexto
El Protocolo de transferencia de hipertexto (HTTP), conocido en inglés como Hypertext Transfer Protocol, es el medio de comunicación utilizado para transferir información a través de archivos (como XML y HTML) en la World Wide Web. Su desarrollo se llevó a cabo mediante la colaboración entre el World Wide Web Consortium y la Internet Engineering Task Force, culminando en 1999 con la publicación de una serie de RFC. Entre ellos, el RFC 2616 es especialmente relevante, ya que define la versión 1.1 del protocolo. HTTP establece la sintaxis y la semántica utilizadas por los componentes de software de la arquitectura web, como clientes, servidores y proxies, para comunicarse entre sí.
Indice de Contenido
Introducción
El Protocolo de Transferencia de Hipertexto (HTTP) se caracteriza por ser un protocolo sin estado, lo que significa que no guarda información sobre conexiones previas. Sin embargo, en el desarrollo de aplicaciones web es frecuente la necesidad de mantener un estado. Para abordar esta situación, se utilizan las cookies, que son fragmentos de información que un servidor puede almacenar en el sistema cliente.
Las cookies permiten a las aplicaciones web establecer la noción de sesión y también posibilitan el seguimiento de los usuarios, ya que pueden ser guardadas en el cliente durante un tiempo prolongado. De esta manera, las cookies se convierten en un mecanismo fundamental para mantener la persistencia de datos entre diferentes interacciones cliente-servidor en el contexto de las aplicaciones web.
El Protocolo de Transferencia de Hipertexto (HTTP) es un protocolo orientado a transacciones que sigue un esquema de petición-respuesta entre un cliente y un servidor. El cliente, también conocido como "agente de usuario" en inglés (user agent), realiza una petición al servidor enviando un mensaje con un formato específico. A su vez, el servidor web, como comúnmente se le denomina, responde al cliente con un mensaje de respuesta.
Los ejemplos de clientes más comunes son los navegadores web, utilizados por usuarios para acceder a sitios web, así como las arañas web o webcrawlers, que son programas automatizados que exploran la web con diversos fines. Este flujo de comunicación basado en el intercambio de mensajes permite la interacción y transferencia de información entre el cliente y el servidor en el entorno de la World Wide Web.
Características
Mensajes
Los mensajes en HTTP se transmiten en texto plano, lo que los hace más legibles y fáciles de depurar. Sin embargo, esta característica también implica que los mensajes sean más largos. Los mensajes siguen la siguiente estructura:
- Línea inicial: La línea inicial termina con un retorno de carro y un salto de línea. En el caso de las peticiones, contiene la acción requerida por el servidor (método de petición), seguida de la URL del recurso y la versión de HTTP que el cliente soporta. En el caso de las respuestas, la línea inicial contiene la versión de HTTP utilizada, seguida del código de respuesta que indica el resultado de la petición y la URL del recurso, junto con la frase asociada a ese código de respuesta.
- Cabeceras del mensaje: Las cabeceras del mensaje proporcionan metadatos y finalizan con una línea en blanco. Estas cabeceras ofrecen una gran flexibilidad al protocolo, ya que permiten incluir información adicional relevante para la comunicación entre el cliente y el servidor.
- Cuerpo del mensaje: El cuerpo del mensaje es opcional y su presencia depende de la línea anterior del mensaje y del tipo de recurso al que hace referencia la URL. Este componente del mensaje típicamente contiene los datos intercambiados entre el cliente y el servidor. Por ejemplo, en una petición, el cuerpo del mensaje podría incluir datos que se desean enviar al servidor para su procesamiento. En una respuesta, el cuerpo del mensaje puede contener los datos solicitados por el cliente.
Esta estructura de mensajes en HTTP permite el intercambio de información entre el cliente y el servidor, brindando flexibilidad y adaptabilidad en la comunicación.
Métodos de petición
HTTP define una serie predefinida de métodos de petición, a veces denominados "verbos", que se pueden utilizar para comunicarse con el servidor. El protocolo cuenta con la flexibilidad de añadir nuevos métodos para introducir nuevas funcionalidades a medida que se avanzan en las versiones. Esta lista ha ido creciendo a lo largo del tiempo, incluyendo los métodos agregados por WebDAV.
Cada método de petición indica la acción que se desea realizar sobre el recurso identificado. La interpretación de este recurso dependerá de la aplicación del servidor. Por ejemplo, el recurso puede representar un archivo que se encuentra en el servidor. Con los diferentes métodos de petición, se pueden realizar acciones como obtener el recurso, enviar datos al servidor para procesamiento, actualizar o eliminar el recurso, entre otros. Esta diversidad de métodos permite una amplia gama de interacciones y operaciones en la comunicación cliente-servidor a través de HTTP.
GET
El método GET se utiliza para solicitar la representación de un recurso específico. Las solicitudes que utilizan el método GET están diseñadas para recuperar datos y no deben tener ningún otro efecto adicional. Esta característica también se aplica a algunos otros métodos HTTP.
Cuando se realiza una solicitud GET, el cliente solicita al servidor la información correspondiente al recurso identificado en la URL. El servidor responde proporcionando la representación del recurso en forma de datos, como HTML, imágenes, archivos de texto, etc. El método GET es idempotente, lo que significa que se puede realizar varias veces sin cambiar el estado del servidor o del recurso solicitado.
Es importante destacar que el método GET no debe tener efectos secundarios, como modificar datos en el servidor. Está diseñado exclusivamente para la recuperación de información. Para realizar acciones que modifiquen los datos en el servidor, se utilizan otros métodos HTTP, como POST, PUT o DELETE, que están diseñados específicamente para esos propósitos.
HEAD
Para obtener una respuesta idéntica a la que correspondería a una petición GET, pero sin incluir el cuerpo en la respuesta, se puede utilizar el método HEAD de HTTP. El método HEAD es similar a GET, pero solo solicita los metadatos de los encabezados de respuesta sin transportar el contenido completo del recurso.
Al realizar una solicitud con el método HEAD, el servidor procesará la solicitud de manera similar a una solicitud GET, pero en lugar de devolver el cuerpo del recurso, solo devolverá los metadatos en los encabezados de respuesta. Esto permite obtener información importante sobre el recurso, como los encabezados de contenido, las cookies, la información de autorización, etc., sin tener que transferir y descargar el contenido completo del recurso.
El uso del método HEAD es útil cuando solo se necesita obtener información de los encabezados de respuesta, como verificar la disponibilidad del recurso, verificar la última modificación del recurso o comprobar los encabezados de autenticación, sin tener que transferir todo el contenido del recurso.
Es importante tener en cuenta que el método HEAD sigue las mismas restricciones que GET en cuanto a su idempotencia y no debe tener efectos secundarios en el servidor o en el recurso solicitado.
POST
Para enviar datos que serán procesados por el recurso identificado en la URL de la línea de petición, se utiliza el método POST de HTTP. Los datos se incluirán en el cuerpo de la petición. A nivel semántico, el método POST está orientado a crear un nuevo recurso, cuya naturaleza será especificada por la cabecera Content-Type.
Al utilizar el método POST, se pueden enviar diferentes tipos de datos según el tipo de contenido especificado en la cabecera Content-Type. Algunos ejemplos comunes son:
- Para datos de formularios codificados como una URL: se utiliza el tipo de contenido "application/x-www-form-urlencoded". En este caso, los datos del formulario se codifican y se envían en el cuerpo de la petición, pero no en la URL.
- Para subir archivos u otros bloques de datos: se utiliza el tipo de contenido "multipart/form-data". Este tipo de contenido se utiliza cuando se desea enviar archivos u otro tipo de datos binarios en el cuerpo de la petición. Permite el envío de datos en bloques separados, junto con metadatos adicionales si es necesario.
Además de los ejemplos mencionados, no existe un estándar obligatorio para el tipo de contenido en el método POST. Pueden utilizarse otros tipos de contenido según los requisitos y el formato de los datos, como "text/plain" para datos de texto sin formato, "application/json" para enviar datos en formato JSON, "application/octet-stream" para datos binarios sin formato, y otros.
Es importante asegurarse de que el tipo de contenido especificado en la cabecera Content-Type coincida con el formato y la estructura de los datos enviados en el cuerpo de la petición, para que el recurso pueda procesarlos correctamente.
Cabeceras
Las cabeceras en las solicitudes y respuestas HTTP proporcionan metadatos que contienen información esencial sobre la transacción en curso. Cada cabecera está compuesta por un nombre seguido de dos puntos, un espacio en blanco y el valor correspondiente, seguido de un retorno de carro y un salto de línea. Se utiliza una línea en blanco para indicar el final de las cabeceras. Si no hay cabeceras, la línea en blanco debe permanecer.
Las cabeceras brindan una gran flexibilidad al protocolo, ya que permiten agregar nuevas funcionalidades sin tener que modificar la base del protocolo. A medida que las versiones de HTTP han ido avanzando, se han agregado más y más cabeceras permitidas.
Las cabeceras pueden contener metadatos que deben ser procesados por el cliente, el servidor o los intermediarios involucrados en la comunicación. Por ejemplo, en respuesta a una solicitud, se puede indicar el tipo de contenido que se envía. El cliente puede especificar los tipos de representaciones de contenido que acepta, y los intermediarios pueden gestionar el almacenamiento en caché.
Las cabeceras se pueden clasificar según su función y propósito. Algunos ejemplos incluyen:
- Cabeceras que indican las capacidades aceptadas por el emisor del mensaje: Accept (indica el tipo de contenido aceptado), Accept-Charset (indica el conjunto de caracteres aceptado), Accept-Encoding (indica los métodos de compresión aceptados), Accept-Language (indica el idioma aceptado), User-Agent (describe al cliente), Server (indica el tipo de servidor), Allow (métodos permitidos para el recurso).
- Cabeceras que describen el contenido: Content-Type (indica el tipo de contenido), Content-Length (longitud del mensaje), Content-Range, Content-Encoding, Content-Language, Content-Location.
- Cabeceras que hacen referencia a URIs: Location (indica la ubicación del contenido), Referer (indica el origen de la solicitud).
- Cabeceras que permiten ahorrar transmisiones: Date (fecha de creación), If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, If-Range, Expires, Last-Modified, Cache-Control, Via, Pragma, Etag, Age, Retry-After.
- Cabeceras para el control de cookies: Set-Cookie, Cookie.
- Cabeceras para autenticación: Authorization, WWW-Authenticate.
- Cabeceras que describen la comunicación: Host (indica el servidor de destino), Connection (indica cómo establecer la conexión).
- Otras cabeceras: Range (para descargar partes específicas del recurso), Max-Forward (límite de cabeceras agregadas en TRACE).
Estas son solo algunas de las cabeceras comunes utilizadas en HTTP, y cada una tiene su función específica en la comunicación entre el cliente y el servidor.