Apuntes sobre Otras cosas

Cajón Desastre: Todo lo que no encaja en ninguna parte.

cURL con APIs y automatización

Los cuatro métodos REST

Las APIs REST usan distintos métodos HTTP para distintas operaciones sobre un recurso:

# Obtener datos (GET)
curl -s https://api.ejemplo.com/usuarios/42

# Crear un recurso (POST)
curl -s -X POST \
     -H "Content-Type: application/json" \
     -d '{"nombre":"Ana"}' \
     https://api.ejemplo.com/usuarios

# Actualizar un recurso (PUT)
curl -s -X PUT \
     -H "Content-Type: application/json" \
     -d '{"nombre":"Ana García"}' \
     https://api.ejemplo.com/usuarios/42

# Eliminar un recurso (DELETE)
curl -s -X DELETE https://api.ejemplo.com/usuarios/42

Código de respuesta HTTP

Para obtener solo el código de estado (200, 404, 500…) sin descargar el cuerpo:

curl -s -o /dev/null -w "%{http_code}" https://api.ejemplo.com/ruta

Útil en scripts para comprobar si un endpoint responde correctamente:

CODIGO=$(curl -s -o /dev/null -w "%{http_code}" https://api.ejemplo.com/ruta)
if [ "$CODIGO" != "200" ]; then
    echo "Error: el servidor devolvió $CODIGO"
fi

Cookies

Guardar las cookies recibidas en un archivo y reutilizarlas en peticiones posteriores:

# Guardar cookies al hacer login
curl -c cookies.txt -d "user=juan&pass=1234" https://ejemplo.com/login

# Usar esas cookies en la siguiente petición
curl -b cookies.txt https://ejemplo.com/area-privada

Subir archivos

Con -F simulas el envío de un formulario con archivo adjunto (multipart/form-data):

curl -F "archivo=@/ruta/local/foto.jpg" \
     -F "descripcion=Mi foto" \
     https://ejemplo.com/upload

Descargar múltiples archivos

# Varios archivos en un solo comando
curl -O https://ejemplo.com/archivo1.pdf \
     -O https://ejemplo.com/archivo2.pdf

# Secuencia numérica (descarga imagen1.jpg hasta imagen10.jpg)
curl -O https://ejemplo.com/imagen[1-10].jpg

cURL en scripts bash

Ejemplo: script que consulta una API con autenticación y procesa la respuesta:

#!/bin/bash

API="https://api.ejemplo.com"
TOKEN="mi_token_aqui"

# Obtener lista de usuarios
respuesta=$(curl -sS \
    -H "Authorization: Bearer $TOKEN" \
    -H "Accept: application/json" \
    "$API/usuarios")

# Comprobar si la respuesta contiene datos válidos
if echo "$respuesta" | grep -q '"id"'; then
    echo "API respondió correctamente"
    echo "$respuesta"
else
    echo "Error o respuesta inesperada: $respuesta"
    exit 1
fi

cURL + jq para procesar JSON

jq es una herramienta de línea de comandos para filtrar y transformar JSON. Combinada con curl es muy potente:

sudo apt install jq

# Formatear JSON de una API
curl -s https://api.ejemplo.com/usuarios | jq

# Extraer un campo concreto
curl -s https://api.ejemplo.com/usuarios/1 | jq '.nombre'

# Extraer un campo de cada elemento de un array
curl -s https://api.ejemplo.com/usuarios | jq '.[].nombre'

# Filtrar elementos del array por condición
curl -s https://api.ejemplo.com/usuarios | jq '.[] | select(.activo == true)'

Depuración y métricas

# Ver tiempos desglosados de una petición
curl -s -o /dev/null -w \
    "DNS: %{time_namelookup}s | Conectar: %{time_connect}s | Total: %{time_total}s\n" \
    https://ejemplo.com

# Guardar log completo de la petición (cabeceras + cuerpo + TLS)
curl -v https://ejemplo.com 2> debug.log

Nota: usa siempre -s en scripts para suprimir la barra de progreso. Añade -S junto a -s para que sí se muestren los errores reales: curl -sS ...

En la próxima lección: cron: programación de tareas automáticas en Linux.

TOP