Pegar un comando y elegir un lenguaje
- 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.
- Pégalo en la caja de arriba.
- 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.
- 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:
-Xy--requestfijan el método.-Hy--headerpueden repetirse. Cada valor se parte por el primer dos puntos y se recortan las dos mitades, y las cabeceras conservan el orden en el que las escribiste.-d,--data,--data-raw,--data-binary,--data-asciiy--data-urlencodecontribuyen todas al cuerpo.-uy--userse convierten en autenticación Basic.-b/--cookie,-A/--user-agenty-e/--refererse convierten en la cabecera que representa cada una.- La primera palabra suelta que no sea el valor de una opción se toma como la URL, entrecomillada o no, esté donde esté dentro del comando.
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.

