1. Esquema de la Estructura de Mensajes HTTP
1.1. Mensaje de Solicitud HTTP
Un mensaje de solicitud HTTP se compone de varias partes esenciales que un cliente envía a un servidor:
┌───────────────────────────────────────────────┐
│ Línea de Solicitud │
│ (Método HTTP | Ruta del Recurso | Versión HTTP)│
│ Ejemplo: GET /recurso/pagina.html HTTP/1.1 │
├───────────────────────────────────────────────┤
│ Cabeceras de Solicitud │
│ Host: www.ejemplo.com │
│ User-Agent: NavegadorWeb/1.0 │
│ Accept: text/html,application/json │
│ Content-Type: application/json │
│ ... │
├───────────────────────────────────────────────┤
│ Línea Vacía (CRLF) │
├───────────────────────────────────────────────┤
│ Cuerpo de la Solicitud (Opcional) │
│ Utilizado principalmente en peticiones POST o PUT.│
│ Ejemplo: {"dato1": "valorA", "dato2": 123} │
└───────────────────────────────────────────────┘
Una aclaración importante sobre el campo Content-Type:
El encabezado Content-Type es un componente clave de las cabeceras de solicitud. Su función principal es informar al servidor sobre el tipo de datos que se incluyen en el cuerpo de la solicitud. Es crucial especificarlo correctamente cuando se envía información en el cuerpo, como ocurre en las solicitudes POST o PUT, para que el servidor pueda interpretar y procesar los datos de manera adecuada.
1.2. Mensaje de Respuesta HTTP
La estructura de un mensaje de respuesta HTTP es análoga a la de la solicitud, siendo la contestación del servidor al cliente:
┌───────────────────────────────────────────────┐
│ Línea de Estado │
│ (Versión HTTP | Código de Estado | Descripción)│
│ Ejemplo: HTTP/1.1 200 OK │
├───────────────────────────────────────────────┤
│ Cabeceras de Respuesta │
│ Content-Type: text/html; charset=UTF-8 │
│ Content-Length: 5678 │
│ Server: ServidorApache/2.4 │
│ ... │
├───────────────────────────────────────────────┤
│ Línea Vacía (CRLF) │
├───────────────────────────────────────────────┤
│ Cuerpo de la Respuesta (Opcional) │
│ Contenido como HTML, JSON, imágenes, etc. │
│ Ejemplo: ...</html> o {"mensaje": "éxito"} │
└───────────────────────────────────────────────┘
1.3. Componentes Fundamentales
- La Línea de Solicitud / Estado es siempre la primera línea del mensaje, indicando la operación deseada (solicitud) o el resultado de la operación (respuesta).
- Las Cabeceras (Headers) proveen metadatos sobre la solicitud o la respuesta, como el agente de usuario, el tipo de contenido o la información del servidor.
- La Línea Vacía es un separador obligatorio que delimita las cabeceras del cuerpo del mensaje.
- El Cuerpo del Mensaje es la sección donde se transimte la carga útil principal, ya sean datos enviados por el cliente o recursos devueltos por el servidor.
1.4. Ejemplos de Construcción del Cuerpo de Solicitud
Utilizando curl para Peticiones HTTP
curl es una herramienta de línea de comandos versátil para interactuar con servidores web. Aquí se muestra cómo estructurar diferentes tipos de cuerpos de solicitud:
# Envío de datos en formato JSON
curl -X POST https://api.servidor.com/data \
-H "Content-Type: application/json" \
-d '{"usuario": "Carlos", "edad": 35}'
# Envío de datos como formulario URL-encoded
curl -X POST https://api.servidor.com/login \
-d "identificador=usuario_ejemplo&clave=mi_secreta"
# Subida de un archivo
curl -X POST https://api.servidor.com/upload \
-F "documento=@mi_informe.pdf"
Realizando Peticiones con la Librería requests en Python
La librería requests de Python simplifica las peticiones HTTP. A continuación, ejemplos para construir cuerpos de solicitud:
import requests
api_url = "https://api.servidor.com/items"
# Petición con cuerpo JSON
json_payload = {"nombre_item": "Laptop", "precio": 1200}
response_json = requests.post(api_url, json=json_payload)
print(f"Respuesta JSON (Estado): {response_json.status_code}")
# Petición con cuerpo de formulario (URL-encoded)
form_payload = {"producto": "Teclado", "cantidad": 2}
response_form = requests.post(api_url, data=form_payload)
print(f"Respuesta Form (Estado): {response_form.status_code}")
# Petición para subir un archivo
try:
with open("imagen_perfil.jpg", "rb") as file_handle:
files_to_upload = {"archivo": file_handle}
response_file = requests.post(api_url + "/upload", files=files_to_upload)
print(f"Respuesta Archivo (Estado): {response_file.status_code}")
except FileNotFoundError:
print("El archivo 'imagen_perfil.jpg' no fue encontrado.")
2. Formatos de Codificación con el Encabezado Content-Type
2.1. ¿Qué es Content-Type?
El encabezado Content-Type, presente tanto en solicitudes como en respeustas HTTP, es fundamental para comunicar el formato exacto del contenido en el cuerpo del mensaje. Actúa como un "identificador de tipo de medio" o MIME type, que guía al receptor (servidor o cliente) sobre cómo debe interpretar y procesar los datos recibidos.
Su sintaxis general es:
Content-Type: tipo-principal/subtipo; parámetros
2.2. Tipos de Content-Type Comúnmente Utilizados
La siguiente tabla detalla algunos de los tipos de contenido más frecuentes y sus aplicaciones:
| Tipo de Contenido | Descripción | Uso Típico y Ejemplos |
|---|---|---|
application/json |
Indica que el cuerpo del mensaje contiene datos estructurados en formato JSON (JavaScript Object Notation). Es ampliamente utilizado en APIs modernas. | Intercambio de datos en APIs RESTful, como {"id": 1, "nombre": "ProductoX"}. |
application/x-www-form-urlencoded |
Se usa para datos de formulario codificados como pares clave-valor, similar a los parámetros de URL, separados por &. Es el valor por defecto para formularios HTML POST simples. |
Envío de formularios web estándar: campo1=valorA&campo2=valorB. |
multipart/form-data |
Empleado para formularios complejos que incluyen archivos binarios. Permite enviar múltiples partes de datos, cada una con su propio encabezado, separadas por un "boundary". | Subida de archivos a través de un formulario HTML o APIs. |
text/plain |
Especifica que el contenido es texto plano sin formato especial. Útil para información sencilla o de depuración. | Mensajes de error simples, datos de registro, contenido para depuración. |
application/xml |
Se utiliza para cuerpos de mensaje que contienen datos estructurados en formato XML (Extensible Markup Language). | Servicios web SOAP, intercambio de datos en sistemas legados. |
application/octet-stream |
Indica que el contenido es un flujo de bytes binarios genérico. El receptor debe determinar cómo manejarlo, ya que no se especifica un tipo más concreto. | Descarga de archivos ejecutables, imágenes, documentos cuyo tipo no se especifica. |
text/html |
Define que el cuerpo del mensaje es un documento HTML, el lenguaje estándar para páginas web. | Páginas web servidas por navegadores, contenido de web scraping. |