Herramientas
Guías

Conversor de curl

Dev

Convierte un comando curl a fetch de JavaScript, axios, Python, Go, Java y HTTPie — en vivo, con pestañas multilingües.

100 % del lado del cliente Sin backend

No se recuperan URLs remotas; pega tu JSON directamente.

Entrada
Pega un comando curl para ver el código convertido.
En esta página

¿Qué es un conversor de curl?#

curl es lo más parecido que HTTP tiene a un lenguaje universal. Todo panel de DevTools del navegador, todo sitio de documentación de APIs y todo tique de soporte acaba poniéndote en las manos un comando curl: «copiar como cURL» es como una petición viaja del navegador a un informe de bug. El problema es que un comando curl pegado rara vez es lo que de verdad puedes ejecutar en tu base de código. Tu servicio está escrito en Python, o en Go, o en fetch del lado del navegador; no quieres invocar curl en una subshell, quieres la llamada equivalente en el cliente HTTP que ya usas.

Esta página tiende ese puente. Pega un comando curl a la izquierda y analiza la sintaxis de shell (flags, comillas, continuaciones de línea, cabeceras, cuerpo, auth) en una petición estructurada, para luego emitir el código equivalente para seis destinos a la vez: fetch del navegador, axios, requests de Python, net/http de Go, HttpURLConnection de Java y httpie. Lees a lo largo de las pestañas, copias la que coincide con tu pila y sigues adelante.

El análisis se ejecuta completamente en tu navegador. El comando que pegas nunca toca un servidor, lo cual importa porque los comandos curl reales suelen contener bearer tokens, credenciales de basic-auth o cookies firmadas.

Cómo se usa#

  1. Pega tu comando curl en el panel de Entrada de la izquierda. Puedes pegar la palabra curl del principio u omitirla: ambas funcionan. Se entienden los comandos multilínea unidos con una \ al final, así como los comandos copiados directamente de una terminal donde cada flag va en su propia línea.
  2. Pulsa Ejemplo para cargar un ejemplo realista si quieres ver primero la forma, o Limpiar para vaciar el panel.
  3. Elige un lenguaje destino en la barra de pestañas sobre la salida: fetch, axios, python, go, java o httpie. Los seis se generan a partir del mismo análisis, así que cambiar de pestaña es instantáneo: no hay reejecución.
  4. Lee el código generado en el panel. Usa Copiar en la barra de pestañas para llevártelo.
  5. Vigila la barra de estado bajo los paneles. Si el analizador topo con un flag que no modela (una redirección a archivo de salida, un ajuste de proxy), lo dice explícitamente en vez de soltarlo en silencio.

Características clave#

  • Un tokenizador de shell de verdad, no un raspado con regex. Las comillas simples, las dobles, el entrecomillado ANSI-C $'...' (con escapes \n, \t, \x41, é), la continuación de línea con barra invertida y nueva línea, y la diferencia entre "a\b" y 'a\b' se gestionan como lo haría bash. Los conversores ingenuos que dividen por espacios en blanco se rompen en cuanto el valor de una cabecera contiene un espacio.
  • Seis destinos de un mismo análisis. Ves fetch, axios, Python, Go, Java y httpie lado a lado. Si dudas entre fetch o axios, puedes comparar cómo maneja cada uno la misma cabecera de auth en dos clics.
  • Inteligencia sobre el cuerpo. Cuando la petición lleva Content-Type: application/json, el emisor de Python la pasa por la palabra clave json= para que un cuerpo con forma de dict se envíe correctamente; en caso contrario, recurre a data=.
  • Basic auth decodificado una sola vez. Un flag -u user:pass se convierte en btoa("user:pass") en fetch, en el bloque auth de axios, en la tupla auth= de requests y en SetBasicAuth en Go: cada expresión idiomática como ese lenguaje la espera.
  • Los flags desconocidos se notifican, no se traguen. -o output.txt o --proxy aparecen en la barra de estado como argumentos desconocidos, así nunca se te induce a creer erróneamente que una conversión capturó una redirección o un proxy que en realidad dejó caer.
  • Sin backend, sin fugas. El comando se tokeniza en memoria mediante el propio script de la página. No hay ninguna llamada de red que lleve tu token pegado a ningún sitio.

Ejemplo práctico#

Carga Ejemplo (o pega el equivalente a lo que producen las DevTools del navegador al «Copiar como cURL» para un POST JSON):

curl -X POST https://example.com/api/v1/users \
  -H 'Authorization: Bearer tok' \
  -H 'Content-Type: application/json' \
  -d '{"name":"Alice","role":"admin"}'

Cambia a la pestaña fetch y obtienes:

const response = await fetch("https://example.com/api/v1/users", {
  method: "POST",
  headers: {
    "Authorization": "Bearer tok",
    "Content-Type": "application/json",
  },
  body: "{\"name\":\"Alice\",\"role\":\"admin\"}",
});

Cambia a la pestaña python. Como Content-Type es JSON, el cuerpo pasa por la palabra clave json=:

import requests

url = 'https://example.com/api/v1/users'
headers = {
    'Authorization': 'Bearer tok',
    'Content-Type': 'application/json',
}
payload = '{"name":"Alice","role":"admin"}'
response = requests.request('POST', url, headers=headers, json=payload)
print(response.status_code)

El mismo comando está también inmediatamente disponible bajo las pestañas go, java, axios e httpie: seis conversiones por el precio de un pegado.

Preguntas frecuentes#

Dice «argumentos desconocidos» para mi comando. ¿Qué ha omitido?#

El analizador modela los flags de curl que usas para describir una petición (método, URL, cabeceras, cuerpo, basic auth, --compressed, -k, -L). Los flags que describen el propio comportamiento de curl (como -o para escribir el cuerpo a un archivo, --proxy, --connect-timeout, --cert) no se traducen, porque no tienen equivalente en una llamada fetch. Se recopilan y se muestran en la barra de estado para que sepas que se soltaron a propósito, no que se perdieron.

¿Puedo convertir un comando que usa entrecomillado ANSI-C $'...'?#

Sí. Las cabeceras y los cuerpos copiados de terminales a veces llegan envueltos en $'...' para que el shell interprete secuencias de escape como \n o \t. El tokenizador entiende el entrecomillado ANSI-C y decodifica \n, \t, \xHH, \uHHHH, \UHHHHHHHH y los escapes simples, así que los bytes que ve el conversor coinciden con los bytes que curl habría enviado.

¿Por qué mi salida de Python usa json= a veces y data= otras?#

El emisor mira tus cabeceras. Cuando está presente Content-Type: application/json, pasa el cuerpo por la palabra clave json=, lo que deja que requests ajuste la cabecera y codifique la carga correctamente. Para cualquier otro tipo de contenido (form-encoded, texto plano, multipart) recurre a data=, porque forzar json= ahí sería incorrecto.

¿Envía la petición por mí?#

No, y es deliberado. Esta herramienta solo traduce el comando a código; nunca lo ejecuta. El fragmento generado se ejecuta en tu propio programa, bajo tus propias credenciales, donde puedes inspeccionarlo antes de que haga nada en real.