Petición HTTP

Fundamentos Jan 9, 2026 HTTP
http request client methods

Definición

Una petición HTTP es un mensaje enviado desde un cliente (navegador, aplicación móvil, consumidor de API) a un servidor para solicitar un recurso específico o disparar una acción. Cada interacción web comienza con una petición HTTP.

La petición consiste en tres partes principales:

  1. Línea de Petición - Método, URI y versión HTTP
  2. Cabeceras - Metadatos sobre la petición (autenticación, tipo de contenido, etc.)
  3. Cuerpo (opcional) - Carga de datos para métodos como POST, PUT, PATCH

Las peticiones HTTP siguen un formato estricto definido en RFC 7231 y son la base de las APIs RESTful y la comunicación web.

Ejemplo

Una petición HTTP GET típica para recuperar datos de usuario:

GET /api/users/123 HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Accept: application/json
User-Agent: Mozilla/5.0

Una petición POST para crear un nuevo recurso:

POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Length: 89

{
  "name": "Alice Smith",
  "email": "[email protected]",
  "role": "developer"
}

Ejemplo de Código

JavaScript (Fetch API):

// Petición GET
const getUser = async (userId) => {
  const response = await fetch(`https://api.example.com/users/${userId}`, {
    method: 'GET',
    headers: {
      'Authorization': 'Bearer YOUR_TOKEN',
      'Accept': 'application/json'
    }
  });

  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }

  return await response.json();
};

// Petición POST
const createUser = async (userData) => {
  const response = await fetch('https://api.example.com/users', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer YOUR_TOKEN'
    },
    body: JSON.stringify(userData)
  });

  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }

  return await response.json();
};

// Uso
const newUser = {
  name: 'Alice Smith',
  email: '[email protected]',
  role: 'developer'
};

createUser(newUser)
  .then(user => console.log('Created:', user))
  .catch(error => console.error('Error:', error));

Python (librería requests):

import requests

# Petición GET
def get_user(user_id):
    response = requests.get(
        f'https://api.example.com/users/{user_id}',
        headers={
            'Authorization': 'Bearer YOUR_TOKEN',
            'Accept': 'application/json'
        }
    )
    response.raise_for_status()
    return response.json()

# Petición POST
def create_user(user_data):
    response = requests.post(
        'https://api.example.com/users',
        json=user_data,
        headers={
            'Authorization': 'Bearer YOUR_TOKEN'
        }
    )
    response.raise_for_status()
    return response.json()

# Uso
new_user = {
    'name': 'Alice Smith',
    'email': '[email protected]',
    'role': 'developer'
}

try:
    user = create_user(new_user)
    print(f'Created: {user}')
except requests.exceptions.HTTPError as e:
    print(f'Error: {e}')

Diagrama

sequenceDiagram
    participant Client
    participant Server

    Note over Client: Preparar Petición
    Client->>Client: Establecer Método (GET/POST/etc)
    Client->>Client: Añadir Cabeceras
    Client->>Client: Añadir Cuerpo (si es necesario)

    Note over Client,Server: Enviar Petición
    Client->>Server: Petición HTTP
    Note right of Server: Línea de Petición
Cabeceras
Cuerpo (opcional) Note over Server: Procesar Petición Server->>Server: Validar Server->>Server: Autenticar Server->>Server: Ejecutar Lógica Note over Client,Server: Enviar Respuesta Server->>Client: Respuesta HTTP Note left of Client: Código de Estado
Cabeceras
Cuerpo Note over Client: Manejar Respuesta Client->>Client: Parsear Respuesta Client->>Client: Actualizar UI/Estado

Analogía

Piensa en una petición HTTP como ordenar en un restaurante:

  • Línea de Petición → “Me gustaría la ensalada César” (qué quieres)
  • Cabeceras → “Sin picatostes, aderezo aparte” (preferencias/metadatos)
  • Cuerpo → Instrucciones personalizadas escritas en una nota (datos adicionales)

El camarero (servidor) toma tu pedido (petición), lo procesa en la cocina y trae tu comida (respuesta).

Mejores Prácticas

  1. Usar Método HTTP Correcto - GET para lecturas, POST para creación, PUT/PATCH para actualizaciones, DELETE para eliminación
  2. Incluir Cabeceras Requeridas - Host, Content-Type, Authorization cuando sea necesario
  3. Establecer Timeouts - Siempre configurar timeouts de petición para prevenir conexiones colgadas
  4. Manejar Errores Graciosamente - Verificar códigos de estado y manejar fallos de red
  5. Usar HTTPS - Siempre encriptar datos sensibles en tránsito
  6. Validar Entrada - Sanitizar datos antes de enviarlos en el cuerpo de la petición
  7. Establecer User-Agent - Identificar tu cliente para logs del servidor y analíticas

Errores Comunes

  • Content-Type Faltante - Enviar JSON sin cabecera Content-Type: application/json
  • Método HTTP Incorrecto - Usar GET con cuerpo, o POST cuando GET es apropiado
  • Sin Manejo de Errores - No verificar códigos de estado de respuesta o errores de red
  • URLs Hardcodeadas - No usar variables de entorno para endpoints de API
  • Enviar Secretos en URLs - Nunca poner claves API o tokens en parámetros de consulta
  • Olvidar Cabeceras CORS - No establecer cabeceras apropiadas para peticiones cross-origin
  • Sin Lógica de Reintento - No implementar backoff exponencial para fallos transitorios

Estándares & RFCs

Términos Relacionados