Saltar a contenido

xh - Hoja de Referencia de Cliente HTTP Moderno

Instalación

Platform Comando
Ubuntu/Debian curl -sfL https://raw.githubusercontent.com/ducaale/xh/master/install.sh \ | sh
Arch Linux pacman -S xh
Fedora/RHEL dnf install xh
macOS (Homebrew) brew install xh
macOS (MacPorts) sudo port install xh
Windows (Scoop) scoop install xh
Windows (Chocolatey) choco install xh
Cargo (All platforms) cargo install xh
Docker docker pull ducaale/xh
Snap snap install xh
## Comandos Básicos
Comando Descripción
xh httpbin.org/get Solicitud GET simple
xh POST httpbin.org/post name=John Solicitud POST con datos JSON
xh PUT httpbin.org/put status=active Solicitud PUT con datos
xh PATCH httpbin.org/patch email=new@email.com Solicitud PATCH para actualizar recurso
xh DELETE httpbin.org/delete Solicitud DELETE
xh HEAD httpbin.org/get Solicitud HEAD (solo encabezados)
xh OPTIONS httpbin.org/get Solicitud OPTIONS
xh httpbin.org/get search==rust GET con parámetro de consulta
xh httpbin.org/get page==1 limit==10 Parámetros de consulta múltiples
xh -a user:pass httpbin.org/basic-auth/user/pass Autenticación básica
xh -A bearer -a token123 api.example.com Autenticación de token de portador
xh httpbin.org/get User-Agent:CustomAgent Encabezado personalizado
xh -b httpbin.org/json Imprimir solo el cuerpo de la respuesta
xh -h httpbin.org/json Imprimir solo encabezados de respuesta
xh -v httpbin.org/json Salida detallada (encabezados + cuerpo)
xh httpbin.org/json -o response.json Descargar respuesta a archivo
xh --follow=0 httpbin.org/redirect/3 No seguir redirects
xh -f POST httpbin.org/post name=John POST con datos de formulario
xh POST httpbin.org/post < data.json POST con contenido de archivo
xh httpbin.org/get Authorization:"Bearer token" Encabezado de Authorization
## Uso Avanzado
Comando Descripción
xh POST httpbin.org/post age:=30 active:=true JSON con coerción de tipos (número/booleano)
xh POST httpbin.org/post tags:='["rust","cli"]' Enviar array JSON
xh POST httpbin.org/post user[name]=John user[age]:=30 Objetos JSON anidados
xh --session=mysession httpbin.org/cookies/set/token/abc Crear sesión con nombre (persistir cookies)
xh --session=mysession httpbin.org/cookies Reutilizar sesión
xh --session-read-only=mysession httpbin.org/get Usar sesión sin actualizarla
xh -f POST httpbin.org/post file@/path/to/file.txt Cargar archivo como formulario multiparte
xh POST httpbin.org/post @file.json Cargar archivo como cuerpo de solicitud
xh --proxy=http:http://proxy.example.com:8080 httpbin.org/get Usar proxy HTTP
xh --proxy=all:socks5://localhost:1080 httpbin.org/get Usar proxy SOCKS5
xh --verify=no https://self-signed.badssl.com/ Omitir verificación SSL (inseguro)
xh --cert=/path/to/ca-cert.pem https://api.example.com Certificado de CA personalizado
xh --cert=/path/to/client.crt --cert-key=/path/to/client.key https://api.example.com Autenticación de certificado de cliente
xh --timeout=30 httpbin.org/delay/5 Establecer tiempo de espera de solicitud (segundos)
xh --pretty=none httpbin.org/json Deshabilitar salida coloreada/formateada
xh --style=monokai httpbin.org/json Utilizar esquema de color específico
xh --stream httpbin.org/stream/100 Respuesta de stream
xh --download httpbin.org/image/png -o image.png Descargar con barra de progreso
xh --continue httpbin.org/stream/100 -o stream.txt Reanudar descarga parcial
xh --http-version=1.1 https://httpbin.org/get Forzar HTTP/1.1
xh --method=CUSTOM httpbin.org/anything Método HTTP personalizado
xh --multipart POST httpbin.org/post name=John file@doc.pdf Formulario multiparte con datos mixtos
xh httpbin.org/get Cookie:session=abc123 Enviar cookies
xh --auth-type=digest -a user:pass httpbin.org/digest-auth/auth/user/pass Autenticación Digest
## Tipos de Datos JSON

Al enviar datos JSON, xh admite la conversión de tipos con una sintaxis especial:

Sintaxis Type Ejemplo
key=value String name=John{"name":"John"}
key:=number Número age:=30{"age":30}
key:=true Boolean active:=true{"active":true}
key:=null Nulo middle:=null{"middle":null}
key:='[...]' Array tags:='["a","b"]'{"tags":["a","b"]}
key:='{...}' Objeto meta:='{"v":1}'{"meta":{"v":1}}
key[sub]=value Anidado user[name]=John{"user":{"name":"John"}}
## Configuración

Ubicaciones de Almacenamiento de Sesión

# Linux/macOS
~/.config/xh/sessions/

# Windows
%APPDATA%\xh\sessions\

Variables de Entorno

# Set default proxy
export HTTP_PROXY=http://proxy.example.com:8080
export HTTPS_PROXY=http://proxy.example.com:8080

# Disable proxy for specific hosts
export NO_PROXY=localhost,127.0.0.1,.example.com

# Default timeout
export XH_TIMEOUT=30

Alias Comunes

# Add to ~/.bashrc or ~/.zshrc

# HTTPie compatibility
alias http='xh'
alias https='xh --default-scheme=https'

# Quick shortcuts
alias xhj='xh --pretty=all'  # Force JSON pretty-print
alias xhn='xh --pretty=none' # No formatting
alias xhv='xh -v'            # Verbose by default
alias xhd='xh --download'    # Download mode

Casos de Uso Comunes

Caso de Uso: Probando API REST con Autenticación

# Login and save session
xh --session=api POST https://api.example.com/login \
  username=admin password=secret

# Make authenticated requests using saved session
xh --session=api GET https://api.example.com/users

# Update resource
xh --session=api PUT https://api.example.com/users/123 \
  name="John Doe" email=john@example.com status=active

# Delete resource
xh --session=api DELETE https://api.example.com/users/123

Caso de Uso: Carga de Archivos con Metadatos

# Upload file with additional form fields
xh -f POST https://api.example.com/upload \
  file@/path/to/document.pdf \
  title="Important Document" \
  category=legal \
  tags:='["contract","2024"]'

# Multiple file upload
xh -f POST https://api.example.com/batch-upload \
  file1@image1.jpg \
  file2@image2.jpg \
  album="Vacation 2024"

Caso de Uso: Pruebas de API con Diferentes Entornos

# Development environment
xh --session=dev POST https://dev-api.example.com/test \
  Authorization:"Bearer dev-token-123" \
  data=test

# Staging environment
xh --session=staging POST https://staging-api.example.com/test \
  Authorization:"Bearer staging-token-456" \
  data=test

# Production environment (with SSL verification)
xh --session=prod POST https://api.example.com/test \
  Authorization:"Bearer prod-token-789" \
  data=test

Caso de Uso: Depurando Cargas de Webhook

# Capture webhook payload to file
xh POST https://webhook.site/your-unique-url \
  event=user.created \
  user[id]:=12345 \
  user[email]=new@example.com \
  timestamp:=$(date +%s) \
  -v -o webhook-debug.txt

# Test webhook with retry logic (in script)
for i in {1..3}; do
  xh POST https://your-app.com/webhook \
    event=test \
    attempt:=$i && break || sleep 5
done

Caso de Uso: Descargando y Procesando Datos de API

# Download JSON data
xh GET https://api.github.com/users/octocat/repos \
  -o repos.json

# Download with authentication and save
xh -a token:ghp_your_token \
  GET https://api.github.com/user/repos \
  visibility==private \
  -o private-repos.json

# Stream large dataset
xh --stream GET https://api.example.com/export/data \
  format==json \
  | jq '.[] | select(.active == true)' \
  > active-records.json

Mejores Prácticas

  • Usar sesiones para flujos de trabajo autenticados: Las sesiones mantienen cookies y encabezados, eliminando la necesidad de volver a autenticarse para cada solicitud. Usar --session=namepara interacciones de API de varios pasos.

  • Aprovechar la conversión de tipos para JSON: Usar :=para números y booleanos (age:=30, active:=true) en lugar de valores de cadena para garantizar tipos JSON correctos en solicitudes de API.

  • Preferir xh sobre curl para pruebas de API: La sintaxis intuitiva (xh POST api.com name=value) es más legible que los indicadores verbosos de curl, lo que lo hace ideal para documentación y pruebas rápidas.

  • Usar modo detallado para depuración: Agregar -vpara ver encabezados de solicitud y respuesta completos al solucionar problemas de API o de autenticación.

  • Almacenar tokens sensibles en variables de entorno: En lugar dexh -a token:secret_key, utilizarxh -a token:$API_TOKENpara evitar exponer credenciales en el historial de shell.

  • Utilizar redirección de salida para automatización: Guardar respuestas con-o file.jsonpara procesamiento o comparación en pipelines de CI/CD y scripts de pruebas automatizadas.

  • Establecer timeouts apropiados: Usar--timeout=30para APIs lentas para prevenir solicitudes colgadas. Establecer--timeout=0solo para operaciones de streaming o de larga duración.

  • Organizar sesiones por entorno: Crear sesiones separadas para desarrollo, staging y producción (--session=prod-api) para evitar usar credenciales accidentalmente.

Resolución de problemas

Problema Solución
SSL certificate verification failed Use --verify=no to skip verification (insecure) or --cert=/path/to/ca.pem to provide custom CA certificate
Connection timeout Increase timeout with --timeout=60 or check network connectivity and proxy settings
401 Unauthorized Verify authentication method: use -a user:pass for basic auth, -A bearer -a token for bearer tokens, or check session validity
JSON parsing error Ensure proper syntax: use := for non-strings (age:=30), quote arrays (tags:='["a","b"]'), and check for unescaped special characters
Command not found: xh Verify installation path is in $PATH, reinstall using preferred method, or use full path /usr/local/bin/xh
Session not persisting Check session directory permissions (~/.config/xh/sessions/), ensure using same session name, verify not using --session-read-only
Proxy connection failed Verify proxy URL format --proxy=http:http://host:port, check proxy authentication if required, ensure proxy allows target host
File upload fails Use -f or --multipart flag for form uploads, verify file path is correct, check file permissions and size limits
Response not formatted/colored Force formatting with --pretty=all, check terminal supports colors, or pipe through jq for JSON formatting