Por Que Aprender cURL?
cURL (Client URL) es una herramienta de linea de comandos para transferir datos usando varios protocolos. Viene preinstalada en macOS y la mayoria de distribuciones Linux, y esta disponible para Windows. Todo QA engineer deberia conocer cURL porque:
- Es universal — disponible en cada servidor, contenedor y runner de CI/CD
- Es scriptable — facilmente integrable en scripts de shell y pipelines
- Es la lingua franca — la documentacion de APIs frecuentemente provee ejemplos en cURL
- No requiere instalacion — a diferencia de Postman, ya esta en tu maquina
- Es preciso — controlas cada aspecto del request
Verificando Tu Instalacion
curl --version
# curl 8.7.1 (x86_64-apple-darwin23.0) ...
Comandos Basicos de cURL
GET Request
# GET simple
curl https://jsonplaceholder.typicode.com/posts/1
# GET con headers
curl -H "Accept: application/json" \
-H "Authorization: Bearer token123" \
https://api.example.com/users
POST Request
# POST con body JSON
curl -X POST \
-H "Content-Type: application/json" \
-d '{"title": "Nuevo Post", "body": "Contenido", "userId": 1}' \
https://jsonplaceholder.typicode.com/posts
# POST con form data
curl -X POST \
-d "username=admin&password=secret" \
https://api.example.com/login
PUT y PATCH
# PUT — reemplazar recurso completo
curl -X PUT \
-H "Content-Type: application/json" \
-d '{"title": "Actualizado", "body": "Nuevo contenido", "userId": 1}' \
https://jsonplaceholder.typicode.com/posts/1
# PATCH — actualizacion parcial
curl -X PATCH \
-H "Content-Type: application/json" \
-d '{"title": "Solo Titulo Cambiado"}' \
https://jsonplaceholder.typicode.com/posts/1
DELETE
curl -X DELETE https://jsonplaceholder.typicode.com/posts/1
Flags Esenciales de cURL
| Flag | Forma Larga | Proposito |
|---|---|---|
-X | --request | Metodo HTTP (GET, POST, PUT, DELETE) |
-H | --header | Agregar header al request |
-d | --data | Datos del body del request |
-v | --verbose | Mostrar detalles completos del request/response |
-s | --silent | Ocultar barra de progreso |
-o | --output | Guardar respuesta en archivo |
-w | --write-out | Formato de salida personalizado |
-L | --location | Seguir redirecciones |
-k | --insecure | Saltar verificacion SSL |
-u | --user | Basic auth (user:password) |
-i | --include | Mostrar headers de respuesta |
-I | --head | HEAD request (solo headers) |
Debugging con cURL
Salida Verbose
El flag -v es tu mejor amigo para debugging:
curl -v https://jsonplaceholder.typicode.com/posts/1
La salida muestra:
>— headers del request enviados<— headers del response recibidos*— info de conexion y detalles SSL
Solo Headers de Respuesta
# Mostrar headers con body
curl -i https://jsonplaceholder.typicode.com/posts/1
# Mostrar solo headers (HEAD request)
curl -I https://jsonplaceholder.typicode.com/posts
Midiendo Tiempo de Requests
curl -w "\nHTTP Code: %{http_code}\nTiempo Total: %{time_total}s\nDNS: %{time_namelookup}s\nConexion: %{time_connect}s\nTTFB: %{time_starttransfer}s\n" \
-s -o /dev/null \
https://jsonplaceholder.typicode.com/posts
Esto muestra metricas de rendimiento sin el body de la respuesta.
Autenticacion con cURL
API Key
# En header
curl -H "X-API-Key: tu-api-key" https://api.example.com/data
# Como query parameter
curl "https://api.example.com/data?api_key=tu-api-key"
Basic Auth
curl -u username:password https://api.example.com/users
# Equivalente a: -H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ="
Bearer Token (JWT/OAuth)
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..." \
https://api.example.com/protected
Tecnicas Avanzadas
Enviando Archivos
# Subir archivo
curl -X POST \
-F "file=@foto.jpg" \
-F "description=Foto de perfil" \
https://api.example.com/upload
# Enviar JSON desde archivo
curl -X POST \
-H "Content-Type: application/json" \
-d @payload.json \
https://api.example.com/users
Guardando Respuestas
# Guardar en archivo
curl -o response.json https://api.example.com/data
# Guardar solo si es exitoso
curl -f -o response.json https://api.example.com/data
Scripting con cURL
#!/bin/bash
# Script simple de health check de API
BASE_URL="https://api.example.com"
ENDPOINTS=("/health" "/users" "/posts")
for endpoint in "${ENDPOINTS[@]}"; do
status=$(curl -s -o /dev/null -w "%{http_code}" "$BASE_URL$endpoint")
if [ "$status" -eq 200 ]; then
echo "OK: $endpoint ($status)"
else
echo "FALLO: $endpoint ($status)"
fi
done
Convirtiendo Entre cURL y Postman
Postman a cURL: Haz clic en el icono </> Code en Postman y selecciona cURL.
cURL a Postman: Haz clic en Import en Postman, pega tu comando cURL y Postman construye el request.
Usando jq para Procesamiento JSON
# Formatear respuesta JSON
curl -s https://jsonplaceholder.typicode.com/posts | jq '.'
# Extraer campo especifico
curl -s https://jsonplaceholder.typicode.com/posts/1 | jq '.title'
# Filtrar array
curl -s https://jsonplaceholder.typicode.com/posts | jq '.[0:3] | .[].title'
Ejercicio Practico
- Ciclo CRUD con cURL: Crea un post (POST), leelo (GET), actualizalo (PUT), luego eliminalo (DELETE) usando JSONPlaceholder
- Debuggea un request: Usa
-vpara inspeccionar todos los headers de un request ahttps://httpbin.org/get - Mide performance: Cronometra 5 endpoints de API publicos diferentes y compara tiempos de respuesta usando
-w - Escribe un script de health check: Crea un script bash que verifique 3 endpoints y reporte status codes
- Practica jq: Obtene posts de JSONPlaceholder y extrae solo los titulos usando jq
Puntos Clave
- cURL es universal, scriptable y disponible en todas partes — conocimiento esencial para cualquier QA engineer
- Domina los flags clave:
-X(metodo),-H(headers),-d(datos),-v(debug),-s(silencioso),-o(salida) - Usa
-wpara medicion de rendimiento y-vpara debugging completo de request/response - cURL se integra naturalmente en scripts de shell, pipelines de CI/CD y health checks automatizados
- Combina cURL con jq para procesamiento poderoso de JSON desde la linea de comandos