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

FlagForma LargaProposito
-X--requestMetodo HTTP (GET, POST, PUT, DELETE)
-H--headerAgregar header al request
-d--dataDatos del body del request
-v--verboseMostrar detalles completos del request/response
-s--silentOcultar barra de progreso
-o--outputGuardar respuesta en archivo
-w--write-outFormato de salida personalizado
-L--locationSeguir redirecciones
-k--insecureSaltar verificacion SSL
-u--userBasic auth (user:password)
-i--includeMostrar headers de respuesta
-I--headHEAD 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

  1. Ciclo CRUD con cURL: Crea un post (POST), leelo (GET), actualizalo (PUT), luego eliminalo (DELETE) usando JSONPlaceholder
  2. Debuggea un request: Usa -v para inspeccionar todos los headers de un request a https://httpbin.org/get
  3. Mide performance: Cronometra 5 endpoints de API publicos diferentes y compara tiempos de respuesta usando -w
  4. Escribe un script de health check: Crea un script bash que verifique 3 endpoints y reporte status codes
  5. 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 -w para medicion de rendimiento y -v para 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