Conversor de Comandos Curl

Pega un comando curl y obtén código equivalente en JavaScript fetch, Python requests, Node axios, PHP o PowerShell. Se ejecuta enteramente en tu navegador.

🌐 English

🔒 Privado por diseño: tu texto se procesa localmente en tu navegador; nada se sube nunca a ningún servidor.

Pegar un comando y elegir un lenguaje

  1. Copia un comando curl de la documentación de una API, de un script de shell, o del panel de red de tu navegador con clic derecho y Copiar como cURL. Los comandos de varias líneas con una barra invertida al final de cada línea no necesitan ninguna limpieza previa.
  2. Pégalo en la caja de arriba.
  3. Pon Lenguaje de destino en uno de estos: JavaScript (fetch), Python (requests), Node.js (axios), PHP (cURL) o PowerShell (Invoke-RestMethod). JavaScript (fetch) viene preseleccionado.
  4. Pulsa el botón de convertir. El código sustituye a la caja donde pegaste, y Copiar al portapapeles te lo deja listo.

Solo se muestra un lenguaje cada vez. Es una decisión deliberada: lo que normalmente quieres es un bloque que puedas soltar directamente en un archivo, no cinco variantes apiladas por las que desplazarte.

Las opciones que lee, y las que descarta en silencio

El análisis va en dos etapas. Primero un tokenizador al estilo del shell parte el texto como lo haría bash, que es lo que hace que el entrecomillado se comporte bien. Dentro de comillas simples no hay nada especial, exactamente igual que en un shell de verdad. Dentro de comillas dobles solo se procesan los pocos escapes que el propio bash reconoce. Fuera de las comillas, una barra invertida justo antes de un salto de línea se trata como continuación de línea y los dos caracteres desaparecen.

Después los tokens se leen como opciones de curl:

Las opciones que cambian el comportamiento de curl sin cambiar la petición se reconocen y se saltan, entre ellas --compressed, -k, -L, -s, -v, -i, -f, -g, -4 y -6. Cualquier otra cosa que empiece por guion también se salta.

La elección del método sigue a curl, no a un valor por defecto

Si el comando no lleva -X, el método no se da por supuesto que sea GET sin más. Un comando que lleve cualquier opción de datos se convierte en POST, y solo un comando sin cuerpo ninguno se convierte en GET. Eso refleja el comportamiento del propio curl, y es la sorpresa más habitual para quien espera que un conversor deje GET fijado a fuego.

La salida de Python va un paso más allá y usa el atajo asociado al método cuando existe, así que un POST se convierte en requests.post(url, ...). Un método poco común como PURGE no tiene atajo, así que recurre a requests.request('PURGE', url, ...).

Cuerpos JSON, y la línea que hay que añadirle a fetch

Cuando el cuerpo empieza por llave o por corchete y se analiza como JSON, cuatro de las cinco salidas lo imprimen como una estructura de verdad en lugar de como una cadena, y solo PowerShell lo mantiene como texto. Python recibe un literal de diccionario con True, False y None escritos a la manera de Python. PHP recibe un literal de array con flechas, pasado por json_encode(). Las salidas de fetch y de axios reciben el objeto ya analizado, impreso como literal de JavaScript.

Eso es correcto para axios, cuyo campo data serializa el objeto por ti. No es correcto para fetch tal y como queda escrito: la Fetch API espera que body sea una cadena, y un objeto plano se convertiría en algo inservible. Envuélvelo tú:

body: JSON.stringify({
  "sku": "A-19",
  "qty": 2
}),

PowerShell mantiene el cuerpo como cadena plana en todos los casos, y funciona porque Invoke-RestMethod lo envía tal cual. Si prefieres mandar una estructura, sustituye la cadena por una tabla hash y pásala por ConvertTo-Json. Cuando el cuerpo no es JSON en absoluto, por ejemplo pares codificados de formulario, todos los lenguajes lo reciben como cadena. Ordenar un cuerpo desastroso antes de convertirlo es más cómodo en el formateador de JSON, que además te dirá si de entrada no era JSON válido.

El escape de comillas es distinto en PowerShell, a propósito

Todos los generadores envuelven sus cadenas en comillas simples, y la regla para escaparlas no es común. JavaScript, Python y PHP usan la barra invertida para proteger una comilla literal o una barra invertida literal. PowerShell no tiene ningún carácter de escape dentro de comillas simples, así que una barra invertida es siempre solo una barra invertida y la única forma de escribir una comilla es duplicarla. Un cuerpo que contenga it's fine sale por tanto como 'it\'s fine' en Python y 'it''s fine' en PowerShell.

Los saltos de línea también divergen. JavaScript y Python no pueden llevar un salto de línea crudo dentro de una cadena entre comillas simples, así que los saltos reales se convierten en secuencias de escape. PHP y PowerShell aceptan los dos un salto de línea literal, y en PHP los caracteres barra invertida y ene no significan nada especial dentro de comillas simples, así que convertirlos cambiaría el valor. Ahí se dejan en paz.

Carencias conocidas: multipart, codificación y orden de las opciones

Las subidas de formulario multipart con -F no se convierten. Peor aún, -F no está en la lista de opciones que se sabe que llevan valor, así que su argumento se queda suelto en el comando y puede confundirse con la URL si aparece antes que la URL real. Lo mismo pasa con otras opciones que llevan valor y no afectan a la petición, como -o. Si la salida muestra una URL rara, borra esas opciones del comando y vuelve a convertir.

A los valores de --data-urlencode no se les aplica la codificación por porcentaje. Las cookies entregadas con -b se convierten en una única cabecera y no en un tarro de cookies. Y aquí no se ejecuta nada: obtienes código para leerlo y ejecutarlo tú, nunca una petición en vivo.

Hay dos vecinas que combinan bien con esta página. Un token de portador sacado de una cabecera convertida se puede inspeccionar con el decodificador de JWT, y un parámetro de consulta que sí necesite escaparse puede pasar antes por el codificador de URL.

Cómo funciona, en imágenes

Captura de pantalla de la herramienta Conversor de Comandos Curl con la entrada de ejemplo «curl -X POST https://api.example.com/v1/convert …», Target language en JavaScript (fetch)
Conversor de Comandos Curl en pleno proceso: la entrada de ejemplo «curl -X POST https://api.example.com/v1/convert …», Target language en JavaScript (fetch).
Captura de pantalla del resultado de Conversor de Comandos Curl mostrando la salida generada «fetch('https://api.example.com/v1/convert', { me…»
El resultado final: la salida generada «fetch('https://api.example.com/v1/convert', { me…». El enlace de descarga es una URL blob local: el archivo nunca sale de tu dispositivo.

Preguntas frecuentes

¿Por qué solo veo un lenguaje a la vez en lugar de los cinco juntos?

El selector de lenguaje de destino muestra un único bloque de código limpio, listo para pegar directamente en tu archivo, en lugar de una salida larga con los cinco lenguajes apilados unos sobre otros que tendrías que desplazar. Cambia la opción "Lenguaje de destino" y vuelve a pulsar el botón para ver un lenguaje distinto para exactamente el mismo comando, sin necesidad de volver a pegarlo.

¿Es seguro pegar un comando curl que contenga una clave de API o un token bearer?

Sí, precisamente por eso existe esto del lado del cliente. Un comando curl copiado de la documentación de una API o de la función "Copiar como cURL" de tu navegador muy a menudo contiene una cabecera Authorization real, una cookie de sesión o una clave de API. Todo aquí (el análisis, la generación de código) se ejecuta como JavaScript normal en esta pestaña del navegador. Nada se sube, registra ni envía a ningún servidor, así que un secreto en tu comando pegado nunca sale de tu dispositivo.

Mi comando curl ocupa varias líneas con una barra invertida al final de cada una, ¿eso funciona?

Sí. Esta es la forma más habitual en la práctica (lo que producen tanto Chrome DevTools como la función "Copiar como cURL" de Postman), un tokenizador real de estilo shell une cada continuación de `\` + salto de línea antes de analizar ninguna opción, exactamente como haría una terminal real al pegar un comando multilínea.

Si uso `-d` sin `-X`, ¿por qué el código generado usa POST en lugar de GET?

Eso es realmente cómo se comporta curl, pasar `-d`/`--data` sin un `-X`/`--request` explícito cambia implícitamente el método a POST, ya que enviar un cuerpo de petición con GET normalmente no tiene sentido. Esta herramienta reproduce ese comportamiento real exacto de curl en lugar de poner GET por defecto en todos los comandos.

¿Entiende un cuerpo de petición JSON, o trata todo como una cadena de texto plana?

Ambas cosas, según el lenguaje. Cuando el cuerpo parece JSON válido, fetch/axios/Python obtienen un objeto/diccionario nativo real (así puedes editarlo directamente como código, no como una cadena JSON), PHP obtiene un array asociativo nativo real pasado por `json_encode()`. PowerShell mantiene el cuerpo como una cadena de texto plana, que sigue funcionando correctamente pero no se convierte en una estructura nativa.

¿Por qué el código de PowerShell escapa las comillas de forma distinta a los otros cuatro lenguajes?

Porque realmente es diferente, las cadenas entre comillas simples de PowerShell no tienen ningún carácter de escape con barra invertida (una barra invertida siempre es literal ahí), y la única forma de representar una comilla simple literal es duplicarla (`''`). JavaScript, Python y PHP usan todos una barra invertida para escapar tanto una barra invertida literal como una comilla simple literal. Se verificó individualmente la regla real de escape de cadenas de cada lenguaje en lugar de asumir que era la misma en todas partes.

¿Qué funciones de curl no están soportadas?

Las subidas de formulario multipart (`-F`/`--form`), la codificación automática por porcentaje de `--data-urlencode` (su valor se usa tal cual) y la mayoría de las opciones que no afectan a la petición HTTP en sí (como `--compressed`, `-k`/`--insecure`, `-L`/`--location`) se reconocen pero no tienen efecto en el código generado, se ignoran de forma segura en lugar de leerse mal como parte de la URL. Cualquier otra opción no reconocida también se ignora en lugar de romper la conversión.

Herramientas relacionadas