Clase 00 — Introducción a curl
curl (Client URL) es una herramienta de línea de comandos para transferir datos con URLs. Soporta más de 25 protocolos, incluyendo HTTP, HTTPS, FTP, SCP, SFTP, y más. Es la navaja suiza de las peticiones HTTP y una herramienta esencial para cualquier DevOps.
¿Por qué aprender curl?
| Uso | Ejemplo |
|---|---|
| Probar APIs | Verificar endpoints antes de escribir código |
| Debug | Diagnosticar problemas de red y HTTP |
| Automatización | Scripts de despliegue, health checks |
| CI/CD | Notificaciones, webhooks, despliegues |
| Monitoreo | Verificar estado de servicios |
| Descargas | Obtener archivos, herramientas, paquetes |
| Seguridad | Probar certificados SSL, headers |
Instalar curl
# macOS (viene preinstalado)
curl --version
# Ubuntu/Debian
sudo apt update && sudo apt install curl -y
# CentOS/RHEL
sudo yum install curl -y
# Alpine
apk add curl
Tu primera petición
# La petición más simple
curl https://httpbin.org/get
# Silencioso + formato con jq
curl -s https://httpbin.org/get | jq '.'
Anatomía de una petición curl
curl -s -X GET \
-H "Content-Type: application/json" \
-H "Authorization: Bearer mi-token" \
-o salida.json \
-w "%{http_code}" \
"https://api.ejemplo.com/datos?page=1&limit=10"
| Parte | Significado |
|---|---|
curl | El comando |
-s | Silencioso (sin barra de progreso) |
-X GET | Método HTTP (GET es el default) |
-H "..." | Header de la petición |
-o salida.json | Guardar respuesta en archivo |
-w "%{http_code}" | Mostrar info extra (código HTTP) |
Opciones más usadas
curl -s https://httpbin.org/get # Silencioso
curl -L https://httpbin.org/redirect/3 # Seguir redirecciones
curl -I https://httpbin.org/get # Solo headers
curl -i https://httpbin.org/get # Headers + body
curl -v https://httpbin.org/get # Verbose (debug)
curl -o archivo.json https://httpbin.org/get # Guardar en archivo
curl -O https://ejemplo.com/archivo.tar.gz # Guardar con nombre original
# Solo el código HTTP
curl -s -o /dev/null -w "%{http_code}" https://httpbin.org/get
# Timeouts
curl --connect-timeout 5 --max-time 10 https://httpbin.org/get
Probar que funciona
# Tu IP pública
curl -s https://httpbin.org/ip | jq '.'
# User-Agent
curl -s https://httpbin.org/user-agent | jq '.'
# Clima en tu ciudad
curl wttr.in/BuenosAires?format=3
# Chiste random
curl -s https://official-joke-api.appspot.com/random_joke | jq '.'
curl vs wget
| Característica | curl | wget |
|---|---|---|
| Protocolos | 25+ (HTTP, FTP, SCP, SMTP...) | HTTP, HTTPS, FTP |
| Salida por defecto | stdout | Archivo |
| APIs REST | ⭐ Excelente | ❌ No diseñado para eso |
| Descargas recursivas | ❌ No | ✅ Sí |
| Scripting | ⭐ Muy flexible | Básico |
Regla general: Usá
curlpara APIs y automatización. Usáwgetpara descargar sitios web completos.
Exit codes de curl
# 0 → Éxito
# 6 → No se puede resolver el host
# 7 → No se puede conectar al host
# 22 → HTTP error (con --fail)
# 28 → Timeout
# 35 → Error SSL
# --fail: Devuelve error si HTTP >= 400
if curl -sf --max-time 5 https://mi-api.com/health > /dev/null; then
echo "Servicio OK"
else
echo "Servicio caído"
fi
Ejemplo: Verificar conectividad
#!/bin/bash
urls=(
"https://google.com"
"https://github.com"
"https://api.ejemplo.com"
)
for url in "${urls[@]}"; do
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "$url")
if [[ "$code" -ge 200 && "$code" -lt 400 ]]; then
printf "✅ %-35s → HTTP %s\n" "$url" "$code"
else
printf "❌ %-35s → HTTP %s\n" "$url" "$code"
fi
done
Ejercicios
- Ejecutá
curl --versiony anotá qué protocolos soporta tu versión - Hacé una petición a
https://httpbin.org/gety formateá la salida conjq - Obtené tu IP pública usando al menos 3 servicios diferentes
- Creá un script que verifique si 5 URLs están accesibles y muestre el código HTTP