Saltar al contenido principal

cURL a código

cURL a código convierte un comando curl en fetch, axios, Python requests, Go, PHP o Ruby en tu navegador. Analiza el comando como shell — comillas simples, comillas dobles, escapes ANSI-C, continuaciones de línea y flags agrupados —, de modo que un payload con un espacio o un apóstrofo sobrevive intacto.

Solo local
Idioma
Comando cURL
0 B1 líneaLín. 1, Col. 1
JavaScript fetch · Cualquier navegador moderno o Node 18+solo lectura
0 B1 línea

¿Cómo funciona cURL a código?

La conversión parece trivial y no lo es, porque un comando curl es shell y no un formato de datos. Tres cosas rompen una implementación ingenua, y las tres son habituales en los comandos que se copian de las herramientas de desarrollo de un navegador.

Las comillas son la parte difícil

-d '{"name":"Ada Lovelace"}' es un solo argumento que contiene un espacio. -H "Authorization: Bearer $TOKEN" contiene una variable que la shell ya expandió o no. --data $'line\nbreak' usa comillas ANSI-C, donde \n es un salto de línea real — y esos mismos caracteres dentro de comillas simples corrientes son una barra invertida y una n literales. Ninguna expresión regular puede deshacer eso, porque las reglas de escapado cambian dentro de cada estilo de comillas. Así que el comando se tokeniza con una pequeña máquina de estados que sabe en qué comillas está en cada momento, y los emisores solo ven argumentos terminados.

Los flags agrupados son tres cosas distintas

-sSL son tres flags sueltos. -XPOST es un flag con el valor pegado. -H'X-Trace: 1' es un flag que toma valor y cuyo valor contiene puntuación y un espacio. Se distinguen recorriendo las letras y parando en la primera que toma valor, que es lo que hace el parser del propio curl — y es la razón por la que -sSXPOST sale como un POST y no como seis flags.

Lo que el código generado se niega a inventar

-d @payload.json lee un archivo en tiempo de ejecución. El archivo no está en el comando, así que el cuerpo no se puede incrustar: el código generado nombra el archivo y te deja la lectura a ti, porque adivinar produciría código que envía en silencio el payload equivocado. -k es la otra omisión deliberada — el código generado mantiene la verificación de certificados activada y lo dice en un comentario, porque un flag inseguro copiado a una base de código es exactamente como acaba en producción.

Todo lo demás se traduce directo: -u se convierte en la cabecera Authorization: Basic que curl envía de verdad, -b en una cabecera Cookie, -F en un formulario multipart con el boundary a cargo del cliente HTTP, y -G mueve los datos al query string, donde los pone curl.

curl

curl -X POST 'https://api.example.com/v1/orders' \
  -H 'Content-Type: application/json' \
  -d '{"total":148.5}'

fetch

const response = await fetch("https://api.example.com/v1/orders", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "total": 148.5
  }, null, 2),
});

const data = await response.json();

curl → fetch

curl

curl -X POST 'https://api.example.com/v1/orders' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_TOKEN_HERE' \
  -d '{"total":148.5}'

fetch

const response = await fetch("https://api.example.com/v1/orders", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer YOUR_API_TOKEN_HERE",
  },
  body: JSON.stringify({
    "total": 148.5
  }, null, 2),
});

const data = await response.json();

¿Qué opciones y casos límite admite cURL a código?

Referencia técnica y opciones
ParámetroTipoValor predeterminadoComportamiento y casos límite
-X, --requestmétodoPOST si hay cuerpoFija el método HTTP. Si se omite, el método es POST cuando el comando tiene cuerpo, campo de formulario o -I, y GET en cualquier otro caso — exactamente la regla que aplica el propio curl.
-H, --headercabecerasningunoSe repite una vez por cabecera. La forma -H "Name;" elimina una cabecera en lugar de fijarla; el código generado sencillamente no la envía, y la página lo dice así en lugar de inventarse un valor.
-d, --data*cuerponingunoVarios flags -d se unen con &, que es lo que hace curl. -d @archivo no se puede incrustar — el archivo no está en el comando —, así que el código generado lo nombra y te deja la lectura a ti.
--data-urlencodecuerpocodificado como formularioEl valor se codifica en porcentaje antes de convertirse en el cuerpo, así que un espacio o un ampersand en el valor es inofensivo. Ese es exactamente el propósito del flag.
-F, --formmultipartningunoSe convierte en un formulario multipart. -F nombre=@archivo adjunta una parte de archivo y -F nombre=valor envía una parte de texto; el boundary se deja al cliente HTTP, porque fijarlo a mano es justo cómo acaba una petición multipart malformada.
-u, --userautenticación básicaningunoSe convierte en la cabecera Authorization: Basic que curl envía de verdad, con la credencial codificada en base64. Es visible en el código generado porque era visible en el comando.
-b, --cookiecabecera CookieningunoUna cadena de cookies separadas por punto y coma se convierte en una única cabecera Cookie, parseada en pares nombre/valor para que el código generado se lea como datos y no como una cadena mágica.
-G, --getcadena de consultadesactivadoMueve todos los campos de -d y --data-urlencode al query string de la URL y vacía el cuerpo, que es como curl lanza un GET con una lista larga de parámetros.
-k, --insecurenotadesactivadoNo se reproduce. El código generado verifica certificados y lleva un comentario que dice que el original no lo hacía. Copiar un flag inseguro a una base de código es justo como sobrevive hasta producción.
--jsoncuerpo + cabecerasningunoFija el cuerpo, Content-Type: application/json y Accept: application/json, igual que la abreviatura que curl añadió en la 7.82.
-o, -m, --retry, --proxyignorados—Las rutas de salida locales, los timeouts, los reintentos y la configuración de proxy no tienen equivalente en la petición generada, así que se consumen y se descartan en lugar de traducirse mal.
Tamaño de salidabytes256 KBUn comando es corto por naturaleza; el techo existe para que un archivo pegado se rechace en lugar de tokenizarse.

Preguntas frecuentes

¿Entiende comandos copiados de las DevTools de Chrome o Firefox?

Sí — es la principal fuente de los comandos que la gente trae aquí. Las DevTools emiten argumentos entre comillas simples, una continuación de barra invertida y salto de línea entre ellos, y a menudo un flag `--compressed` y una cabecera de cookies larga. Las tres cosas se manejan: la continuación es un salto de línea y no contenido, --compressed se anota y se descarta porque cada cliente de aquí negocia la compresión por su cuenta, y -b se convierte en una cabecera Cookie.

¿Qué pasa con -d @payload.json?

El código generado nombra el archivo y deja la lectura incompleta para que tú la completes. No se puede incrustar: el contenido del archivo no está en el comando, e inventar un cuerpo de relleno produciría código que envía en silencio el payload equivocado — un bug que solo aparece contra una API real. La herramienta te dice qué archivo vio en lugar de adivinarlo.

¿Por qué no se traslada -k?

Porque copiarlo es justo como un flag inseguro llega a producción. El código generado mantiene activada la verificación de certificados y lleva un comentario que dice que el original la desactivó, así que la decisión sigue a la vista y es deliberada. Si de verdad lo necesitas, el comentario indica dónde cambiarlo — y en Node es una variable de entorno, no un cambio de código.

¿Cómo se tratan las variables de shell y los caracteres escapados?

Las variables se dejan tal cual están escritas, porque la shell ya las expandió para cuando pegas el comando — un $TOKEN literal en el texto significa que la variable no se expandió, así que se queda como un marcador que puedes ver. El escapado se interpreta como corresponde: dentro de comillas dobles una barra invertida solo escapa los cinco caracteres que POSIX contempla, dentro de comillas simples no se escapa nada, y $'…' son comillas ANSI-C, donde \n es un salto de línea real.

¿Qué destino conviene elegir?

fetch si el código va a un navegador o a Node 18+, que hoy es la mayoría de los casos. axios cuando el proyecto ya lo usa, porque serializa JSON y gestiona los códigos de estado de error por ti. Python requests para un script, Go para un servicio, PHP o Ruby cuando esa es la base de código. Los seis producen la misma petición; solo difieren en la ceremonia que exige cada lenguaje.

¿Mi comando se envía a algún sitio?

No. El parseo y la generación corren en esta pestaña. Importa porque un comando curl suele contener una clave de API en vivo, una cookie de sesión o un bearer token — la cabecera Authorization del ejemplo de arriba es exactamente eso. No se envía nada, y no hay ninguna ruta de API a la que enviarlo.