Uso básico¶
Interfaz de línea de comandos¶
La interfaz de línea de comandos de httptap ofrece varias opciones para personalizar tus solicitudes HTTP y la salida.
Sintaxis¶
Opciones¶
Compatibilidad con curl: Los flags habituales de curl se aceptan como alias. Cambia
curlporhttptapy sigue usando opciones familiares como-X/--request,-L/--location,-m/--max-time,-k/--insecure,-xy--http1.1;-f/--fail,-4/--ipv4,-6/--ipv6y--resolveusan los mismos nombres que en curl. Esto no es un clon completo de curl: limítate a los flags coincidentes que se enumeran aquí.
Opciones de solicitud¶
-X, --request, --method METHOD¶
Especifica el método HTTP que se usará. Métodos admitidos: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS.
Los valores del método no distinguen entre mayúsculas y minúsculas.
Alias compatibles con curl: -X, --request.
Comportamiento por defecto: - Sin --data: usa GET por defecto - Con --data pero sin --method: cambia automáticamente a POST (similar a curl) - Con --method explícito: respeta el método especificado
-d, --data DATA¶
Envía datos en el cuerpo de la solicitud. Puede ser una cadena en línea o una referencia a un archivo usando la sintaxis @filename.
Datos JSON en línea:
Cargar desde un archivo:
Los datos en línea se envían con los bytes exactos del argumento, como en curl; en sistemas POSIX esto incluye argumentos que no son UTF-8 válido.
Detección automática: - El Content-Type se detecta automáticamente (JSON, XML, texto plano) - Primero se comprueba la extensión del archivo (.json, .xml, .txt) - Recurre a la validación JSON
Ejemplos con distintos métodos:
# POST (detectado automáticamente cuando --data está presente)
httptap --data '{"key": "value"}' https://httpbin.io/post
# PUT
httptap --method PUT --data '{"status": "updated"}' https://httpbin.io/put
# PATCH
httptap --method PATCH --data '{"field": "modified"}' https://httpbin.io/patch
# GET explícito con cuerpo (poco común, genera una advertencia)
httptap --method GET --data 'query-data' https://httpbin.io/get
-H, --header¶
Añade cabeceras HTTP personalizadas a la solicitud. Puede usarse varias veces.
httptap \
-H "User-Agent: MyApp/1.0" \
-H "Authorization: Bearer token123" \
https://httpbin.io/bearer
Los nombres de cabecera deben ser tokens HTTP (letras, dígitos y !#$%&'*+-.^_`|~) y los valores solo pueden contener caracteres ASCII imprimibles, espacios y tabuladores. Una cabecera que incumpla estas reglas, como un nombre con un espacio, un valor con CR, LF u otro carácter de control, o un valor no ASCII (httpx envía los valores de las cabeceras como ASCII), se rechaza con el código de salida 64 antes de realizar ninguna solicitud. El error indica la cabecera, pero nunca muestra su valor.
-L, --location, --follow¶
Sigue las redirecciones HTTP y muestra la temporización de cada paso de la cadena (máximo 10 redirecciones).
Alias compatibles con curl: -L, --location.
Por defecto, httptap no sigue las redirecciones y se detiene en la primera respuesta de redirección (código de estado 3xx).
Si la respuesta sigue siendo una redirección tras seguir 10 redirecciones, httptap se detiene, imprime una advertencia, marca ese paso con redirect_limit_reached: true en la exportación JSON y sale con el código 47.
Al seguir redirecciones, httptap aplica las mismas reglas que curl y los navegadores:
- Las cabeceras
Authorization,CookieyProxy-Authorizationsolo se envían al origen original (esquema, host y puerto). En cuanto una redirección apunta a otro origen, se descartan para el resto de la cadena; una actualización dehttpahttpsen el mismo host con los puertos por defecto (80 → 443) las conserva. 303 See Other, y301/302tras unPOST, cambian la siguiente solicitud aGETsin cuerpo.307y308conservan el método y el cuerpo.
Si el Location de una redirección no se puede solicitar (un puerto no válido o fuera de rango, falta el host, un esquema distinto de http/https, un literal IPv6 mal formado), se conserva el paso 3xx y la cadena termina con un paso fallido para ese destino con el error Invalid redirect target: …, y httptap sale con el código 75. Sin --follow, la respuesta 3xx se muestra tal como se recibió, sea cual sea su Location.
Las credenciales de una URL Location (https://user:password@host/) se enmascaran en la salida y en la exportación JSON (https://user:****@host/), pero se sigue la URL real.
-m, --max-time, --timeout SECONDS¶
Aborta la cadena de solicitudes si el tiempo total transcurrido supera el número de segundos especificado.
El límite es un plazo estricto para toda la cadena, redirecciones incluidas: la resolución DNS, la conexión, la espera de la respuesta y la lectura del cuerpo lo comparten, y un servidor que se detiene o sigue enviando bytes con cuentagotas se corta cuando vence. El paso falla entonces con Request timeout: total deadline exceeded y httptap sale con el código 75.
Alias compatibles con curl: -m, --max-time.
El tiempo de espera por defecto es de 20 segundos.
--no-http2 / --http1.1¶
Desactiva la negociación de HTTP/2 y fuerza conexiones HTTP/1.1.
Por defecto, HTTP/2 está activado si el servidor lo admite.
Alias compatible con curl: --http1.1.
-4, --ipv4 y -6, --ipv6¶
Restringe la resolución DNS y la conexión a IPv4 o IPv6. Las opciones son mutuamente excluyentes.
No pueden usarse con proxies HTTP, HTTPS o SOCKS5H, porque esos proxies resuelven ellos mismos el nombre de host de destino.
--resolve HOST:PORT:ADDR¶
Conecta un nombre de host y un puerto a una dirección IPv4 o IPv6 concreta conservando la cabecera Host original y el SNI de TLS. Resulta útil para probar un backend antes de un cambio de DNS o para evitar un registro DNS round-robin. La opción puede repetirse para distintos pares de host y puerto.
httptap --resolve api.example.com:443:203.0.113.10 https://api.example.com/health
httptap --resolve api.example.com:443:[2001:db8::10] https://api.example.com/health
Los nombres de host internacionalizados coinciden en cualquiera de sus formas: una entrada para bücher.example también se aplica a https://xn--bcher-kva.example/, y viceversa. httptap resuelve estos nombres en su forma IDNA 2008 (xn--…), el mismo nombre que envía en la cabecera Host y en el SNI de TLS.
--resolve se aplica a las conexiones directas y a los proxies SOCKS5 con DNS local. Los proxies HTTP, HTTPS y SOCKS5H resuelven el destino de forma remota, por lo que combinarlos con --resolve se rechaza, igual que con -4/-6.
-k, --insecure, --ignore-ssl¶
Desactiva la verificación del certificado TLS. Útil para depurar hosts autofirmados o certificados caducados.
Warning
Usa esta opción solo en redes de confianza. Desactiva la validación de certificados y relaja las restricciones de la negociación TLS.
Alias compatibles con curl: -k, --insecure.
-x, --proxy URL¶
Enruta las solicitudes a través del proxy especificado. Admite los protocolos HTTP, HTTPS, SOCKS5 y SOCKS5H.
Alias compatible con curl: -x.
# proxy HTTP
httptap --proxy http://proxy.local:8080 https://httpbin.io/get
# proxy SOCKS5 (DNS resuelto por el proxy)
httptap --proxy socks5h://proxy.local:1080 https://httpbin.io/get
# proxy SOCKS5 (DNS resuelto localmente)
httptap --proxy socks5://proxy.local:1080 https://httpbin.io/get
# Ignora las variables de entorno de proxy y conecta directamente
httptap --proxy "" https://httpbin.io/get
El flag --proxy tiene prioridad sobre las variables de entorno (HTTP_PROXY, HTTPS_PROXY, NO_PROXY). Usa --proxy "" para ignorar todas las variables de entorno de proxy y conectar directamente. Consulta Funciones avanzadas para más detalles sobre los protocolos de proxy, la resolución DNS y la configuración mediante variables de entorno.
Las credenciales de la URL del proxy (http://user:password@proxy:3128), incluidas las que proceden de variables de entorno, se usan para la conexión pero se enmascaran en la salida y en la exportación JSON (http://user:****@proxy:3128).
Un proxy indicado sin esquema (proxy.local:3128) se trata como http://, igual que en curl. Una URL de proxy mal formada (un esquema no admitido, falta el host, un puerto no válido o fuera de rango, un literal IPv6 sin cerrar) se rechaza con el código de salida 64 antes de realizar ninguna solicitud; el error muestra la URL con la contraseña enmascarada.
--cacert, --ca-bundle PATH¶
Usa un paquete de certificados CA personalizado (formato PEM) para la verificación TLS. Útil para endpoints internos firmados por una CA privada.
Mutuamente excluyente con --ignore-ssl.
Opciones de salida¶
--compact¶
Muestra los resultados en un formato compacto de una sola línea, adecuado para el registro (logging).
Salida:
Step 1: 200 GET https://httpbin.io/get | dns=8.9ms connect=97.0ms tls=194.6ms ttfb=446.0ms total=447.3ms | 389 B
--compact imprime una línea legible por humanos por cada paso (adecuada para registros y para el rastreo de cadenas de redirecciones) sin dejar de renderizar la cabecera de análisis y la tabla Redirect Chain Summary. El tamaño de la respuesta se muestra con la unidad apropiada (B, KB, MB). Para una salida procesable por máquinas, consulta --metrics-only.
--metrics-only¶
Genera métricas en bruto sin formato, ideal para scripting y automatización.
Salida:
Step 1: dns=30.1 connect=97.3 tls=199.0 ttfb=472.2 total=476.0 status=200 bytes=389 ip=44.211.11.205 family=IPv4 tls_version=TLSv1.2 proxy=direct
--json PATH¶
Exporta todos los datos de la solicitud a un archivo JSON. Usa - para escribir el JSON en stdout en su lugar; en ese caso se suprime el informe habitual para que la salida pueda canalizarse.
Si no se puede escribir el archivo, httptap sale con el código 73.
El archivo JSON contiene:
- Desglose de tiempos de todas las fases
- Información de red (dirección IP, detalles de TLS, información del certificado)
- Metadatos de la respuesta (estado, cabeceras, tamaño del cuerpo)
- Cadena completa de redirecciones (al usar
--follow) - Evaluación de SLO (cuando se proporciona
--slo)
--har PATH¶
Exporta la cadena de solicitudes como un archivo HTTP Archive (HAR 1.2) que pueden abrir las DevTools de los navegadores y los visores de HAR. Usa - para escribirlo en stdout; en ese caso se suprime el informe habitual. --har se puede combinar con --json, pero solo uno de ellos puede usar -.
httptap --follow --har run.har https://httpbin.io/redirect/2
httptap --har - https://httpbin.io/get | jq '.log.entries[].timings'
Si no se puede escribir el archivo, httptap sale con el código 73. Consulta Exportación HAR para ver la correspondencia de tiempos y los campos que añade httptap.
--prometheus PATH¶
Escribe los tiempos por fase en el formato del textfile collector de Prometheus. Las duraciones se exportan como gauges httptap_request_duration_seconds con las etiquetas host, step y phase, junto a httptap_request_success y httptap_last_run_timestamp_seconds; las rutas y las query strings nunca se usan como etiquetas.
--otlp ENDPOINT¶
Exporta la ejecución como una única traza de OpenTelemetry: un span raíz, un span por cada paso de la solicitud y spans hijos para las fases de DNS, conexión, TLS, espera del servidor y transferencia. Instala primero la dependencia opcional:
--slo KEY=MS[,KEY=MS...], --slo-file PATH¶
Comprueba el paso final correcto frente a presupuestos de latencia por fase. Ante una violación, httptap sigue renderizando el informe completo pero sale con el código 4 para que el resultado pueda condicionar trabajos de CI, sondas de cron o comprobaciones de disponibilidad (readiness) de Kubernetes.
httptap --slo total=500,ttfb=200 https://httpbin.io/get
# Un umbral por línea; los valores en línea anulan los del archivo.
httptap --slo-file slo.txt --slo total=1000 https://httpbin.io/get
Claves admitidas: dns, connect, tls, ttfb, wait, xfer, total. Consulta la página dedicada Comprobación de umbrales SLO para la especificación completa, la precedencia de códigos de salida y recetas de CI/cron.
-f, --fail¶
Sale con el código 22 cuando cualquier solicitud completada devuelve HTTP 4xx o 5xx, sin dejar de renderizar el informe de tiempos completo ni de escribir la salida de --json. Los fallos de red y TLS conservan sus códigos de salida existentes, de mayor prioridad.
--version¶
Muestra la versión de httptap y sale.
Métodos HTTP¶
httptap admite todos los métodos HTTP estándar:
- GET - Recupera un recurso (por defecto cuando no se proporciona
--data) - POST - Crea/envía un recurso (seleccionado automáticamente cuando se proporciona
--data) - PUT - Reemplaza un recurso
- PATCH - Actualiza parcialmente un recurso
- DELETE - Elimina un recurso
- HEAD - Obtiene solo las cabeceras
- OPTIONS - Consulta los métodos permitidos
Lógica de selección de método¶
- Método explícito:
--methodsiempre tiene prioridad - Auto-POST: Cuando
--dataestá presente sin--method, usa POST por defecto - GET por defecto: Sin
--datani--method, usa GET
Ejemplos por caso de uso¶
Pruebas de API:
# Crear recurso
httptap --data '{"title": "New Post"}' https://httpbin.io/post
# Actualizar recurso
httptap --method PUT --data '{"title": "Updated"}' https://httpbin.io/put
# Actualización parcial
httptap --method PATCH --data '{"status": "published"}' https://httpbin.io/patch
# Eliminar recurso
httptap --method DELETE https://httpbin.io/delete
Comprobaciones de estado:
# Comprobación rápida (solo cabeceras)
httptap --method HEAD https://httpbin.io/status/200
# Respuesta completa
httptap https://httpbin.io/status/200
Flujo de la solicitud¶
Cada solicitud de httptap sigue estas fases:
- Resolución DNS - Búsqueda del nombre de dominio
- Conexión TCP - Establecer la conexión TCP (a través de un proxy HTTP CONNECT: conectar con el proxy y abrir el túnel)
- Negociación TLS - Negociar la conexión segura (solo HTTPS)
- Espera del servidor - Tiempo entre el envío de la solicitud y el primer byte de la respuesta
- Transferencia del cuerpo - Descargar el cuerpo de la respuesta
Entender la salida¶
Modo Rich (por defecto)¶
La salida rich por defecto muestra una tabla de cascada con:
- Nombre de la fase y duración
- Barra de progreso visual
- Detalles de red (IP, versión de TLS, información del certificado)
- Metadatos de la respuesta (estado, tamaño, cabecera
Server, destino de la redirección)
Desglose de tiempos¶
- DNS (ms) - Tiempo para resolver el dominio a una dirección IP
- Connect (ms) - Tiempo para establecer la conexión TCP; a través de un proxy HTTP CONNECT también incluye el viaje de ida y vuelta de CONNECT, de modo que el establecimiento del túnel no se cuenta como espera del servidor. Cuando el host tiene varias direcciones y las primeras fallan, el tiempo dedicado a ellas también se cuenta aquí y en Total (como
time_connectde curl) - TLS (ms) - Tiempo de la negociación TLS (solo HTTPS)
- TTFB (ms) - Tiempo hasta el primer byte (incluye el procesamiento del servidor)
- Transfer (ms) - Tiempo para descargar el cuerpo de la respuesta
- Total (ms) - Duración de la solicitud de extremo a extremo
Información de red¶
- Dirección IP - Dirección IP resuelta y familia (IPv4/IPv6)
- Versión de TLS - Versión del protocolo (TLS 1.2, TLS 1.3)
- Conjunto de cifrado - Conjunto de cifrado negociado
- CN del certificado - Common Name del certificado del servidor
- Caducidad del certificado - Días hasta que caduca el certificado
Ejemplos¶
Comprobación de estado básica¶
Solicitud de API con autenticación¶
httptap \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "Accept: application/json" \
https://httpbin.io/bearer
Seguir la cadena de redirecciones¶
Exportar para análisis¶
Registrar en un archivo¶
¿Qué sigue?¶
-
Modos rich, compact, JSON y metrics
-
Componentes personalizados y uso programático
-
Amplía httptap con protocolos