Probador de Peticiones HTTP y conversor de curl

Envía peticiones HTTP, genera código y convierte curl

Envía peticiones HTTP, genera código y convierte curl

Rellena URL, método, cabeceras y cuerpo para enviar una petición HTTP real y ver la respuesta tal cual. Puedes pegar un comando curl para cargarlo, o copiar la petición actual como curl.

Escribe una URL y aquí verás exactamente por dónde viaja la petición.

Cómo envía las peticiones esta herramienta (detalles)
  • Lo predeterminado es el envío directo. Al pulsar Enviar, tu navegador llama al servidor de destino. Nada de la petición pasa por nuestros servidores.
  • El navegador a veces lo bloquea. Si el destino no devuelve Access-Control-Allow-Origin (CORS), el navegador impide leer la respuesta. La mayoría de las API en producción funcionan así.
  • Solo entonces ofrecemos el relé. Si el intento directo falla aparece el botón «Enviar a través de nuestro servidor». Solo al pulsarlo la URL, las cabeceras y el cuerpo viajan por nuestro relé (api.everytooleverywhereallatonce.com, un Cloudflare Worker) hasta el destino. Eso incluye los valores de Authorization, Cookie o claves de API.
  • El relé no guarda la petición. La reenvía, devuelve la respuesta y descarta ambas. No queda registro. Solo se conserva un contador de peticiones por IP para evitar abusos.
  • El relé elimina las cabeceras que podrían falsificar la IP de origen (x-forwarded-*, cf-*, host). Si no defines User-Agent, envía uno que identifica a esta herramienta.
  • Las direcciones privadas y localhost nunca se retransmiten (evita el escaneo de redes internas). Solo funcionan con envío directo.
  • Límites: cuerpo de 512 KB, respuesta de 2 MB (se trunca), 20 segundos de espera, 20 peticiones por minuto y por IP.
Importar / exportar un comando curl

Cómo se usa

  • Elige método, escribe la URL y pulsa Enviar. Añade filas de nombre/valor en la pestaña Cabeceras y pega JSON o datos de formulario en Cuerpo.
  • Pega un comando copiado con «Copy as cURL» desde las herramientas de desarrollo y pulsa Cargar: método, URL, cabeceras y cuerpo se rellenan solos.
  • Los navegadores impiden que los scripts fijen cabeceras como User-Agent, Cookie o Referer. Si escribes alguna, la pestaña Cabeceras te lo indica.
  • En envío directo solo se ven las cabeceras de respuesta de la lista segura de CORS (Content-Type, Cache-Control…). Usa el relé si las necesitas todas.
  • Nada de lo que escribes se guarda — al recargar la página desaparece.

Por dónde viaja tu petición

  • Ruta predeterminada — navegador → destino. Enviar siempre empieza como una petición directa del navegador. Nada pasa por nuestros servidores y el destino ve tu propia IP.
  • Ruta con relé — navegador → api.everytooleverywhereallatonce.com → destino. Se usa solo después de que CORS bloquee el intento directo y solo si pulsas «Enviar a través de nuestro servidor». Nunca se activa sola (salvo que marques «reintentar automáticamente durante esta visita», y aun así cada respuesta lleva su etiqueta de ruta).
  • Qué hace el relé. Reenvía tu petición tal cual y devuelve la respuesta tal cual. No almacena, registra ni cachea la URL, las cabeceras, el cuerpo ni la respuesta. Solo se conserva un contador de peticiones por IP que limita los abusos.
  • Qué cambia el relé. Elimina las cabeceras que podrían falsificar la IP de origen (x-forwarded-*, cf-*, forwarded, host) y las de nivel de conexión. Si no defines User-Agent, envía uno que identifica a esta herramienta para que los responsables del destino sepan qué es ese tráfico.
  • Qué no retransmite. localhost, rangos privados y direcciones de metadatos en la nube. Para eso, usa el envío directo.
  • Límites. Cuerpo de 512 KB, respuesta de 2 MB (se trunca), 20 segundos de espera, 20 peticiones por minuto y por IP.
  • Esta es una de las pocas herramientas del sitio cuyos datos pueden salir de tu navegador. La sección 4 de la política de privacidad describe cuándo y cómo.

Acerca de Probador de Peticiones HTTP y conversor de curl

Esta página tiene tres modos. El probador de peticiones envía la petición de verdad y muestra la respuesta. El constructor de peticiones te deja rellenar parámetros de consulta, cabeceras y cuerpo en tablas y genera un comando curl, sin enviar nada. El conversor de curl traduce un comando curl a JavaScript fetch, Python requests, Node.js axios o PHP cURL.

Por defecto el probador envía la petición directamente desde tu navegador con fetch. Por eso una API que devuelve 200 con curl en la terminal falla aquí con tanta frecuencia. A continuación se explica el motivo, qué cambia el navegador en tu petición y qué opciones tienes cuando el envío directo queda bloqueado.

Por qué curl funciona y el navegador no

Un navegador no entrega a un script la respuesta de un servidor de otro origen (esquema, host y puerto) salvo que ese servidor lo autorice con la cabecera Access-Control-Allow-Origin. Eso es CORS. curl no tiene página ni origen, así que la regla no le afecta. La mayoría de las APIs de pagos, mapas o datos públicos están pensadas para llamadas de servidor a servidor y sencillamente no envían esa cabecera.

Si la petición no es 'simple', el navegador envía antes una preflight: una petición OPTIONS que pide permiso. Poner Content-Type: application/json, añadir una cabecera Authorization o usar PUT o DELETE la activan. Si el servidor no responde al OPTIONS con Access-Control-Allow-Methods y Access-Control-Allow-Headers adecuados, la petición real no llega a salir. Es la explicación habitual cuando un GET a una API funciona y un POST con JSON a la misma API falla.

Para la página, un bloqueo CORS es indistinguible de un fallo de DNS o una conexión rechazada: ambos llegan como un TypeError, 'Failed to fetch'. Los navegadores ocultan la diferencia a propósito, así que la herramienta los etiqueta como 'CORS o red' en lugar de adivinar. La causa real aparece en la consola de las herramientas de desarrollo. Solo dos casos se distinguen con seguridad: una URL http://, bloqueada como contenido mixto porque esta página es https, y una petición que cancelaste tú.

Qué cambia el navegador al enviar directamente

  • Las cabeceras prohibidas, como Cookie, Host, Origin, Referer, Content-Length o Connection, no pueden fijarse desde un script y se descartan sin aviso. La herramienta las nombra en cuanto las escribes, y avisa también de User-Agent.
  • No se envían cookies. fetch se llama con credentials: 'omit', así que aunque tengas sesión iniciada en el sitio de destino, tu sesión no viaja con la petición.
  • Solo se pueden leer las cabeceras de respuesta de la lista segura de CORS: Cache-Control, Content-Language, Content-Length, Content-Type, Expires, Last-Modified y Pragma. Otras, como X-RateLimit-Remaining, quedan ocultas salvo que el servidor las incluya en Access-Control-Expose-Headers.
  • Con 'Seguir redirecciones' desactivado, el navegador devuelve un 3xx como redirección opaca, sin estado ni Location legibles. Para inspeccionar una redirección, usa el relé.

Enviar a través del relé

Si el envío directo falla, 'Enviar a través de nuestro servidor' reenvía la petición mediante el relé del sitio. De servidor a servidor no hay CORS, y las cabeceras que el navegador descartaría pasan intactas. A cambio, la URL, las cabeceras y el cuerpo completos pasan por un tercero, así que antes de enviar la herramienta enumera los nombres de todo lo que parezca una credencial, como Authorization o api_key, y pide confirmación. Mejor una clave de pruebas que una de producción.

Límites: cuerpo de petición de 512 KB, respuesta de 2 MB (se trunca a partir de ahí), 20 segundos de espera y 20 peticiones por minuto e IP. localhost, los rangos privados como 10.x o 192.168.x y las direcciones de metadatos de la nube se rechazan, así que un servidor de desarrollo interno solo se puede probar con envío directo. El destino ve la IP del relé, no la tuya, algo relevante si la API tiene una lista de IPs permitidas.

Cómo se traducen las opciones de curl

Pega la salida de 'Copy as cURL' de las herramientas del navegador y el probador rellenará la petición con estas reglas.

  • -d, --data-raw y --data-binary pasan a ser el cuerpo. Sin -X el método es POST y, sin Content-Type, se añade application/x-www-form-urlencoded, igual que hace curl. Varios -d se unen con &. Un valor que empieza por @, como -d @archivo, hace que curl lea ese archivo; la herramienta no puede leer archivos, así que conserva el texto literal y muestra un aviso. Los comandos curl que genera la herramienta pasan el cuerpo con --data-raw para evitarlo.
  • --json fija el cuerpo y añade Content-Type y Accept: application/json.
  • -G mueve los datos de -d a la cadena de consulta y envía un GET. Los valores de --data-urlencode se codifican con porcentajes.
  • -u usuario:clave se convierte en una cabecera Authorization: Basic, salvo que también haya una Authorization con -H: entonces, como en curl, gana el valor de -H y -u se descarta con un aviso. -I significa HEAD, -b se convierte en Cookie, -A en User-Agent y -e en Referer.
  • -F (subida multipart), -T, --proxy y las opciones de certificados no se pueden trasladar y generan un aviso. -k se ignora porque ni el navegador ni el relé pueden saltarse la validación de certificados. Opciones de salida como -L, -s o --compressed se descartan en silencio.

Constructor de peticiones y conversor de curl

El constructor añade solo las filas de consulta marcadas, cada una codificada con encodeURIComponent, y si el cuerpo es JSON lo valida primero con JSON.parse y no genera el comando si es inválido. Si eliges JSON o formulario y dejas vacío Content-Type, se añade el valor correcto. El comando resultante pasa el cuerpo con --data-raw en vez de -d, porque -d interpreta un valor que empieza por @ como nombre de archivo.

El conversor escribe el mismo comando en cuatro lenguajes, cada uno con su estilo. -u se convierte en una cabecera Basic en fetch y axios, en auth=("user", "pass") en requests y en CURLOPT_USERPWD en PHP. -k da verify=False en Python, pero en el fetch del navegador no existe equivalente: una página no puede desactivar la validación de certificados.

Ejemplos

Cargar un comando 'Copy as cURL'

Entrada
curl 'https://api.example.com/v1/items?page=2' -H 'Authorization: Bearer abc' -u admin:secret --json '{"name":"pen"}' -k -F file=@a.png
Resultado
POST https://api.example.com/v1/items?page=2 Authorization: Bearer abc Content-Type: application/json Accept: application/json Cuerpo: {"name":"pen"} Avisos: -k ignorado, -F no admitido, -u ignorado porque hay -H Authorization

Si un comando trae -H Authorization y -u a la vez, curl envía el valor de -H y descarta la cabecera Basic que habría creado -u. La herramienta hace lo mismo: deja una sola cabecera Authorization y avisa. Para usar Basic, quita la línea -H y vuelve a importar (admin:secret se convierte en Basic YWRtaW46c2VjcmV0).

Construir una consulta con -G

Entrada
curl -G https://api.example.com/search -d q=hello --data-urlencode 'city=São Paulo'
Resultado
GET https://api.example.com/search?q=hello&city=S%C3%A3o+Paulo

La ã ocupa dos bytes en UTF-8, C3 A3, y el espacio se escribe como + en la cadena de consulta.

Conversor de curl, Python requests

Entrada
curl -X POST https://api.example.com/v1/items -H 'Content-Type: application/json' -u admin:secret -d '{"name":"pen"}'
Resultado
headers = {"Content-Type": "application/json"} data = "{\"name\":\"pen\"}" auth = ("admin", "secret") requests.request("POST", url, headers=headers, data=data, auth=auth)

El cuerpo va en data= como cadena y no en json=, así que los bytes enviados son idénticos a los de curl.

Cómo se usa

  1. Escribe el método y la URL, o pega un comando curl y pulsa Cargar.
  2. Rellena las pestañas de cabeceras y cuerpo y pulsa Enviar.
  3. Si CORS lo bloquea, lee la explicación y usa el relé solo cuando lo necesites.
  4. Para obtener código, copia el comando del constructor o de la pestaña del conversor.

Preguntas frecuentes

En Postman funciona, pero aquí da error de CORS.

La aplicación de escritorio de Postman no es un navegador y no aplica CORS. El envío directo de esta página sigue las reglas del navegador; si el servidor no permite peticiones de otro origen, necesitas el relé.

¿Sirve para comprobar la configuración CORS de mi API?

Sí, con un envío directo. Si funciona, la API permite el origen de este sitio; si falla, la consola indica qué cabecera falta. Que funcione por el relé no dice nada sobre CORS.

¿Puedo probar una API en localhost?

Solo con envío directo, y el servidor local debe permitir el origen de este sitio mediante CORS. El relé rechaza direcciones privadas.

¿Por qué solo veo unas pocas cabeceras de respuesta?

En un envío directo los scripts solo pueden leer las cabeceras de la lista segura de CORS. Envíala por el relé para verlas todas.

Fuentes

Revisado el:

Privacidad y tratamiento de datos