HTTP (HyperText Transfer Protocol)

CONCEPTSIntermedio
⏱️ 5 min de lectura🏷️ protocol, web, communication

HTTP (HyperText Transfer Protocol)

HTTP es el protocolo de comunicación que define cómo se intercambian mensajes entre clientes y servidores en la World Wide Web.

¿Qué es HTTP?

Imagina que HTTP es como el sistema postal de internet - define exactamente cómo deben estar "escritas las cartas" (peticiones) para que lleguen correctamente, y cómo deben responder los destinatarios.

HTTP (HyperText Transfer Protocol) es el protocolo de comunicación que hace posible la World Wide Web. Es el conjunto de reglas que define cómo los navegadores web se comunican con los servidores para intercambiar información.

HTTP funciona así:

  • Conversación estructurada - Como enviar cartas con formato específico
  • Petición y respuesta - Tú pides algo, el servidor te responde
  • Sin memoria - Cada petición es independiente, como cartas separadas
  • Universal - Puede transportar texto, imágenes, videos, cualquier dato
  • Transparente - Los mensajes son legibles y fáciles de entender

Cuando escribes una URL en tu navegador y presionas Enter, estás iniciando una conversación HTTP: tu navegador envía una petición al servidor, y el servidor responde con la página web que querías ver.

Estructura de una Petición HTTP

GET /api/usuarios HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
Content-Type: application/json

{
  "filtro": "activos",
  "limite": 10
}

Partes de la Petición

  1. Línea de petición: Método + URL + Versión
  2. Headers: Metadatos de la petición
  3. Cuerpo: Datos opcionales (en POST, PUT, etc.)

Métodos HTTP

GET

GET /api/usuarios/123 HTTP/1.1
Host: api.example.com
  • Propósito: Obtener datos
  • Idempotente: Sí
  • Cacheable: Sí
  • Cuerpo: No

POST

POST /api/usuarios HTTP/1.1
Host: api.example.com
Content-Type: application/json

{
  "nombre": "Juan Pérez",
  "email": "[email protected]"
}
  • Propósito: Crear recursos
  • Idempotente: No
  • Cacheable: No
  • Cuerpo: Sí

PUT

PUT /api/usuarios/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json

{
  "nombre": "Juan Pérez Actualizado",
  "email": "[email protected]"
}
  • Propósito: Actualizar/crear recurso completo
  • Idempotente: Sí
  • Cacheable: No
  • Cuerpo: Sí

PATCH

PATCH /api/usuarios/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json

{
  "email": "[email protected]"
}
  • Propósito: Actualizar parcialmente
  • Idempotente: No necesariamente
  • Cacheable: No
  • Cuerpo: Sí

DELETE

DELETE /api/usuarios/123 HTTP/1.1
Host: api.example.com
  • Propósito: Eliminar recurso
  • Idempotente: Sí
  • Cacheable: No
  • Cuerpo: No generalmente

HEAD

HEAD /api/usuarios/123 HTTP/1.1
Host: api.example.com
  • Propósito: Obtener solo headers (como GET pero sin cuerpo)
  • Idempotente: Sí
  • Cacheable: Sí
  • Cuerpo: No

OPTIONS

OPTIONS /api/usuarios HTTP/1.1
Host: api.example.com
  • Propósito: Obtener métodos permitidos
  • Usado para: CORS preflight

Estructura de una Respuesta HTTP

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2023 12:28:53 GMT
Server: Apache/2.4.41
Content-Type: application/json; charset=UTF-8
Content-Length: 348
Cache-Control: max-age=3600
Access-Control-Allow-Origin: *

{
  "id": 123,
  "nombre": "Juan Pérez",
  "email": "[email protected]",
  "fechaCreacion": "2023-01-15T10:30:00Z"
}

Partes de la Respuesta

  1. Línea de estado: Versión + Código + Mensaje
  2. Headers: Metadatos de la respuesta
  3. Cuerpo: Datos de respuesta

Códigos de Estado HTTP

1xx - Informacional

  • 100 Continue: El servidor recibió la petición inicial
  • 101 Switching Protocols: Cambio de protocolo

2xx - Éxito

  • 200 OK: Petición exitosa
  • 201 Created: Recurso creado exitosamente
  • 204 No Content: Éxito sin contenido
  • 206 Partial Content: Contenido parcial

3xx - Redirección

  • 301 Moved Permanently: Recurso movido permanentemente
  • 302 Found: Redirección temporal
  • 304 Not Modified: Recurso no modificado (cache)
  • 307 Temporary Redirect: Redirección temporal manteniendo método

4xx - Error del Cliente

  • 400 Bad Request: Petición mal formada
  • 401 Unauthorized: Autenticación requerida
  • 403 Forbidden: Acceso denegado
  • 404 Not Found: Recurso no encontrado
  • 405 Method Not Allowed: Método no permitido
  • 409 Conflict: Conflicto con el estado actual
  • 422 Unprocessable Entity: Entidad no procesable
  • 429 Too Many Requests: Demasiadas peticiones

5xx - Error del Servidor

  • 500 Internal Server Error: Error interno del servidor
  • 501 Not Implemented: Funcionalidad no implementada
  • 502 Bad Gateway: Gateway erróneo
  • 503 Service Unavailable: Servicio no disponible
  • 504 Gateway Timeout: Timeout del gateway

Headers HTTP Importantes

Headers de Petición

# Identificación
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Host: example.com

# Contenido
Content-Type: application/json
Content-Length: 348
Content-Encoding: gzip

# Autenticación
Authorization: Bearer token123
Cookie: sessionId=abc123; userId=456

# Negociación de contenido
Accept: application/json, text/html
Accept-Language: es-ES, en-US
Accept-Encoding: gzip, deflate

# Cache
If-None-Match: "etag123"
If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT

# CORS
Origin: https://example.com
Access-Control-Request-Method: POST

Headers de Respuesta

# Información del servidor
Server: nginx/1.18.0
Date: Mon, 27 Jul 2023 12:28:53 GMT

# Contenido
Content-Type: application/json; charset=UTF-8
Content-Length: 348
Content-Encoding: gzip

# Cache
Cache-Control: max-age=3600, public
ETag: "etag123"
Expires: Tue, 28 Jul 2023 12:28:53 GMT
Last-Modified: Mon, 27 Jul 2023 10:00:00 GMT

# Seguridad
Strict-Transport-Security: max-age=31536000
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

# CORS
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization

# Cookies
Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure

Ejemplo de Intercambio HTTP

Petición

POST /api/auth/login HTTP/1.1
Host: api.example.com
Content-Type: application/json
User-Agent: MiApp/1.0

{
  "email": "[email protected]",
  "password": "secreto123"
}

Respuesta

HTTP/1.1 200 OK
Content-Type: application/json
Set-Cookie: token=jwt123; HttpOnly; Secure; Path=/
Access-Control-Allow-Origin: https://miapp.com

{
  "success": true,
  "user": {
    "id": 123,
    "name": "Usuario",
    "email": "[email protected]"
  },
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}

HTTPS

HTTPS es HTTP sobre SSL/TLS, proporcionando:

  • Cifrado: Datos encriptados en tránsito
  • Autenticación: Verificación de identidad del servidor
  • Integridad: Protección contra alteraciones
HTTP  → Puerto 80  → Sin cifrado
HTTPS → Puerto 443 → Con cifrado SSL/TLS

HTTP/2 y HTTP/3

HTTP/2

  • Multiplexing: Múltiples peticiones en paralelo
  • Server Push: El servidor puede enviar recursos proactivamente
  • Header Compression: Compresión HPACK
  • Binario: No es texto plano

HTTP/3

  • QUIC: Protocolo de transporte sobre UDP
  • Menor latencia: Menos round-trips
  • Mejor en redes inestables: Resistente a pérdidas de paquetes

Herramientas para HTTP

Desarrollo

  • curl: Cliente de línea de comandos
  • Postman: Cliente gráfico para APIs
  • HTTPie: Cliente simple para terminal
  • Insomnia: Alternativa a Postman

Debugging

  • Browser DevTools: Inspector de red
  • Wireshark: Análisis de tráfico
  • Charles Proxy: Proxy para debugging
  • Fiddler: Debugging en Windows

Relacionado

Términos Relacionados