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.