curl → Code Converter

Convert curl commands to fetch, axios, Node, Python, PHP, Go. Browser-only.

converters

curl → Code Converter

curl command
fetch

Note: curl parsing runs server-side (tree-sitter requires native bindings). Your command is sent over HTTPS, parsed, and discarded — never logged or stored.

What next?

How it works

Qué hace esta herramienta

Pega cualquier comando curl y esta herramienta lo convierte a una solicitud HTTP equivalente en el lenguaje de tu elección: fetch del navegador, Node.js node-fetch, Python requests, PHP cURL o Go net/http. El código generado está listo para pegar en tu proyecto — headers, body, auth y parámetros de consulta, todo traducido fielmente.

Esto es útil cuando copias una solicitud desde las DevTools del navegador ("Copy as cURL"), de la documentación de una API o del terminal de un colega, y necesitas código funcional en tu lenguaje sin mapear manualmente cada flag.

Por qué el parseo se ejecuta en el servidor

La mayoría de las herramientas en navegador se ejecutan completamente en JavaScript del lado del cliente. Este convertidor es diferente: el parseo ocurre en el servidor.

La razón es tree-sitter. La biblioteca curlconverter usa la gramática Bash de tree-sitter para parsear comandos curl como un árbol de sintaxis real en lugar de usar expresiones regulares. El binding de Node.js de tree-sitter compila a un módulo nativo .node — requiere binarios nativos que no pueden ejecutarse en un contexto de navegador. Ejecutar en el servidor proporciona un parseo correcto respaldado por AST en lugar de una regex frágil que se rompe con casos borde de comillas.

Tu comando se parsea en el servidor y el resultado se devuelve. El comando nunca se registra, almacena ni asocia con tu sesión. Solo existe en memoria durante la duración de la conversión y se descarta inmediatamente.

Lenguajes destino soportados

| Destino | Notas | |---|---| | fetch (navegador) | Usa fetch() con Promise; sin dependencias adicionales | | node-fetch | CommonJS require('node-fetch'), Node 14 e inferior; Node 18+ usa fetch nativo | | Python requests | El cliente HTTP más popular de Python | | PHP cURL | Llamadas directas a funciones curl_*; compatible con PHP 7.4+ | | Go net/http | Solo librería estándar, sin dependencias de terceros |

Cómo tree-sitter parsea curl

Un comando curl es una invocación de comando Bash. Tree-sitter lo parsea en un árbol de sintaxis concreto (CST) que captura el nombre del comando, flags, valores de flags, estilo de comillas y posiciones de argumentos — exactamente como lo vería un shell. Esto significa que el parser maneja correctamente:

  • Strings de comillas simples ('value with spaces')
  • Strings de comillas dobles con secuencias de escape ("value \"with\" quotes")
  • Comillas ANSI-C ($'value\twith\ttabs')
  • Comandos multilínea con continuaciones \
  • Flags en cualquier orden

Un parser basado en regex necesitaría lógica especial para cada uno de estos casos. El enfoque de tree-sitter los maneja como consecuencia natural de parsear la gramática Bash real.

Flags comunes y cómo se traducen

-H / --header se convierte en un par clave-valor en el objeto headers de fetch, una entrada de lista en requests.get(..., headers=...) o una llamada curl_setopt(CURLOPT_HTTPHEADER, ...) en PHP.

-d / --data envía un body de solicitud. El convertidor detecta el tipo de contenido de tu header Content-Type: si es application/json, el body se emite como objeto parseado (JSON.stringify(...) en JS, un diccionario en Python); si es application/x-www-form-urlencoded, usa la API de codificación de formularios apropiada.

--data-raw es similar a -d pero omite la interpretación @filename — el valor siempre se trata como string literal, nunca se lee de un archivo.

-u / --user se traduce a un header Authorization: Basic <base64(user:pass)> (btoa(user:pass) en JS, auth=(user, pass) en requests, CURLOPT_USERPWD en PHP).

-X / --request establece el método HTTP explícitamente. El convertidor respeta esto incluso cuando se podría inferir un valor predeterminado.

-F / --form genera código multipart/form-data — FormData en fetch, files= en requests, CURLFORM_* en PHP.

Casos borde a conocer

--compressed indica a curl que solicite respuestas comprimidas con gzip. Fetch y requests manejan la descompresión automáticamente; el convertidor emite una nota pero no agrega código de descompresión explícito ya que las bibliotecas lo manejan de forma transparente.

Cookie jars (-b con filename). El convertidor traduce cookies en línea -b 'key=val' a un header Cookie, pero no puede replicar archivos de cookie-jar — esa es una característica específica de curl que requiere almacenamiento persistente.

Certificados de cliente (--cert, --key). Son opciones TLS que requieren configuración a nivel del cliente HTTP, no a nivel de solicitud. El convertidor incluye un comentario apuntando a la documentación de la biblioteca relevante cuando encuentra estos flags.

Múltiples URLs. Si un comando curl lista más de una URL, el convertidor procesa la primera URL y emite una advertencia.

Leer el código generado críticamente

El convertidor hace lo mejor que puede, pero trata la salida como un punto de partida, no como código listo para producción:

  • Agrega manejo de errores (try/catch, verificaciones de estado de respuesta) apropiado para tu base de código.
  • Revisa las credenciales hardcodeadas en -u o headers Authorization — muévelas a variables de entorno.
  • En Python, considera requests.Session() para múltiples solicitudes al mismo host (connection pooling, headers compartidos).
  • En Go, reutiliza una instancia http.Client en lugar de crear una por solicitud.

Herramientas relacionadas

  • URL Encoder — codifica valores individuales de query-string antes de insertarlos en una URL.
  • JWT Decoder — inspecciona bearer tokens que ves en headers Authorization de curl.

FAQ

¿Por qué el convertidor se ejecuta en el servidor en lugar del navegador?

El parser está construido sobre tree-sitter con gramática Bash, que compila a un binario nativo de Node.js (módulo .node). Los binarios nativos no pueden ejecutarse dentro del sandbox del navegador. La ejecución en servidor te da un parseo real respaldado por AST — el mismo que produciría un shell real — en lugar de una aproximación con regex que puede parsear incorrectamente strings con comillas complejas o comandos multilínea.

¿Mi comando curl se almacena o registra en algún lugar?

No. Tu comando se envía al servidor solo para ser parseado y convertido. Existe en memoria durante la duración de esa solicitud — típicamente unos pocos milisegundos — y luego se descarta. Nunca se escribe en disco, nunca se asocia con tu dirección IP o sesión, y nunca se incluye en ningún registro. La respuesta del servidor contiene únicamente el código convertido.

¿A qué lenguajes puedo convertir?

fetch del navegador, Node.js node-fetch, Python requests, PHP cURL (funciones curl_*) y Go net/http. Estos cubren los casos de uso más comunes para desarrolladores que copian solicitudes de DevTools o documentación de API. La biblioteca curlconverter subyacente soporta más lenguajes que pueden agregarse en el futuro.

El código generado no tiene el body de la solicitud — ¿qué salió mal?

La causa más común es que tu valor -d o --data contiene comillas sin escapar que rompen el parseo. Intenta envolver todo el comando curl entre comillas dobles, o escapa las comillas internas. También verifica que no hayas usado --data-binary con un argumento @filename — las referencias a archivos no pueden resolverse en el servidor y se preservarán como comentario en la salida.

¿Cómo se convierte -u user:password?

El flag -u produce un header Authorization: Basic <base64(user:password)> en la salida. En Python requests, se convierte en el argumento auth=('user', 'password'), que la biblioteca codifica automáticamente. Siempre mueve las credenciales hardcodeadas del código generado a variables de entorno antes de hacer commit.

¿Puede manejar uploads multipart (-F)?

Sí. El flag -F name=value genera FormData en JavaScript (fetch/node-fetch), files={'name': ...} en Python requests y las llamadas apropiadas CURLOPT_HTTPPOST / curl_mime_* en PHP. Los archivos referenciados con @filepath se convierten a comentarios indicando que se necesita un file handle en tiempo de ejecución.

La salida para Go usa ioutil.ReadAll — ¿está deprecado?

ioutil.ReadAll fue deprecado suavemente en Go 1.16 en favor de io.ReadAll. Si estás en Go 1.16 o posterior, reemplaza ioutil.ReadAll(resp.Body) con io.ReadAll(resp.Body) y elimina el import io/ioutil. El código generado prioriza compatibilidad amplia; ajústalo a tu versión objetivo de Go.

¿Por qué el código fetch generado no incluye manejo de errores?

El convertidor produce la traducción mínima fiel de tu comando curl — refleja lo que curl hace por defecto, que es tener éxito o fallar sin lógica de reintentos. Agrega if (!response.ok) throw new Error(response.statusText) (o equivalente) apropiado a tu estrategia de manejo de errores. Incorporar un patrón con opinión para cada lenguaje y base de código está fuera del alcance de un convertidor.