Convertidor cURL a Fetch (JS & Node)

Convertidor cURL a Fetch (JS & Node)

Convierte comandos cURL a sintaxis Fetch API al instante. Analiza cabeceras HTTP, tokens de autenticación, cookies y cargas JSON a código JavaScript moderno con async/await.

Plantillas rápidas
Entrada de comando cURL
Variante de ejecución
Tiempo de espera máximo (ms)10,000 ms
/**
 * Generated by ToolsAA cURL to Fetch Engine (ES2022 async/await)
 * Zero external dependencies. 100% Client-Side Executed.
 */
async function executeRequest() {
  const url = 'https://api.stripe.com/v1/payment_intents';

  const body = new URLSearchParams({
    'amount': '2000',
    'currency': 'usd',
    'payment_method_types[]': 'card',
  });

  const controller = new AbortController();
  const timeoutId = setTimeout(() => controller.abort(), 10000);

  try {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Authorization': 'Basic ' + (typeof window !== 'undefined' ? btoa('sk_test_51MzEXAMPLESECRETKEY:') : Buffer.from('sk_test_51MzEXAMPLESECRETKEY:').toString('base64')),
      },
    body,
    credentials: 'include',
      signal: controller.signal,
    });

    clearTimeout(timeoutId);

    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status} ${response.statusText}`);
    }

    // Automatic MIME response parser
    const contentType = response.headers.get('content-type') || '';
    if (contentType.includes('application/json')) {
      const data = await response.json();
      return data;
    }

    return await response.text();
  } catch (error) {
    clearTimeout(timeoutId);
    if ((error as any)?.name === 'AbortError') {
      console.error('Request timed out after 10000ms');
    }
    throw error;
  }
}

// Call request
executeRequest()
  .then(data => console.log('Response Payload:', data))
  .catch(err => console.error('Fetch Execution Failed:', err));

Flujo de procesamiento de la solicitud

tokens: 12•Cabeceras HTTP: 1•Puntuación de seguridad 76%•BROWSER
Tokenización cURLAnálisis léxico de flags, URL y argumentos cURL12 tokens procesados (220 caracteres)Extracción de cabeceras y cargaAutenticación activa • Conexión segura (HTTPS TLS)POST1 Cabeceras HTTPSaneamiento y validación CORSURLENCODED Vista previa de la carga52 B (Body)Generación de sintaxis Fetch76%BROWSER55 líneas (10000ms)
Métrica principalRFC 9110 DFA
Método HTTPPOST
Total de cabeceras1
Tipo de cargaURLENCODED
Eficiencia / Capacidad0 bytes transmitidos a servidores externos
Salida netaBROWSER
Referencia técnica y guía de arquitectura

Conversor cURL a Fetch (JS & Node) — Guía de referencia

Convierte comandos cURL a sintaxis Fetch API al instante. Analiza cabeceras HTTP, tokens de autenticación, cookies y cargas JSON en código JavaScript moderno con async/await.

Conversor cURL a Fetch (JS & Node) — Guía de referencia — Arquitectura en memoria del lado del cliente y flujo de datos
Conversor cURL a Fetch (JS & Node) — Guía de referencia — Arquitectura en memoria del lado del cliente y flujo de datos

Parámetros clave y controles

Cadena de comando cURL (CLI)Comando POSIX Shell (Bash / Zsh)

Invocación directa desde la línea de comandos iniciada con 'curl'. Admite continuaciones de línea multilínea con barra invertida (\), escape de comillas simples y dobles de shell, y convenciones estándar de flags POSIX.

Por defecto: curl -X GET 'https://api.example.com/data'
Entorno de ejecución y sintaxis de frameworkVariante de destino JavaScript / TypeScript

Define el formato de emisión del código: async/await estándar ES2022 para navegador, TypeScript fuertemente tipado con genéricos ApiResponse, sintaxis de servidor Node.js 18+ con AbortSignal, Next.js App Router con etiquetas de caché o sintaxis de cliente Axios.

Por defecto: browser
Resolución del método HTTP (-X / --request)Verbo HTTP RFC 9110 (GET, POST, PUT, DELETE, PATCH, HEAD)

Verbo de la petición HTTP. Cuando se omite -X, cURL adopta GET por defecto automáticamente, a menos que existan flags de cuerpo de petición (-d, --data, -F), los cuales cambian implícitamente el método predeterminado a POST.

Por defecto: GET
Cabeceras de la petición HTTP (-H / --header)Pares clave-valor de cabecera HTTP

Metadatos personalizados de la petición. Las implementaciones de fetch en el navegador aplican restricciones de cabeceras prohibidas (por ejemplo, Host, Content-Length y Cookie no pueden sobrescribirse manualmente mediante la API Headers por motivos de aislamiento de seguridad).

Por defecto: Content-Type: application/json
Cuerpo de datos o payload (-d / --data / -F)Entidad del cuerpo de petición HTTP

Carga útil de datos transferida en peticiones POST, PUT o PATCH. Se procesa dinámicamente como JSON.stringify() para cadenas JSON, URLSearchParams() para application/x-www-form-urlencoded o FormData() para cargas multipart.

Por defecto: {}
Autenticación Basic y Bearer (-u / Bearer)Cadena de credenciales de autorización

Credenciales de autenticación. cURL -u usuario:contraseña se sintetiza en 'Authorization: Basic <base64>', mientras que -H 'Authorization: Bearer <token>' se extrae en variables estructuradas con enmascaramiento opcional de seguridad.

Por defecto: Bearer <TOKEN>

Consejos profesionales y mejores prácticas

Fetch no rechaza en estados HTTP 4xx o 5xx (La trampa de response.ok)

A diferencia de cURL CLI (que muestra códigos de error en terminal) o Axios (que rechaza promesas ante respuestas 4xx/5xx), la API nativa Fetch de JavaScript solo rechaza su promesa ante un fallo de red real o cuando CORS bloquea la petición. Una respuesta 404 Not Found, 401 Unauthorized o 500 Internal Server Error se resuelve exitosamente. Debes comprobar explícitamente 'if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);' antes de invocar response.json() o response.text().

Nunca definas manualmente Content-Type en Multipart/Form-Data con Fetch

Al convertir comandos cURL con subida de archivos mediante -F ('--form') a Fetch, NO agregues manualmente la cabecera 'Content-Type: multipart/form-data'. Si lo haces, eliminarás el parámetro dinámico de delimitación (por ejemplo, 'boundary=----WebKitFormBoundary...') que el navegador genera automáticamente para segmentar el payload. Pasa la instancia de FormData directamente a la propiedad body y el entorno calculará el Content-Type correcto con sus límites correspondientes.

Diferencias críticas entre datos de formulario -d y serialización JSON en cURL

En cURL, enviar -d sin especificar una cabecera Content-Type explícita asume por defecto 'application/x-www-form-urlencoded', no JSON. Muchos desarrolladores cometen el error de encapsular -d 'key=val&foo=bar' dentro de JSON.stringify(). Comprueba siempre si tu payload son pares clave-valor (que deben usar 'new URLSearchParams({ key: 'val', foo: 'bar' })') o JSON válido (que requiere 'JSON.stringify(data)' y la cabecera explícita 'Content-Type: application/json').

Restricciones de cabeceras prohibidas en navegadores frente a terminal cURL

Desde la terminal, cURL puede forjar cualquier cabecera HTTP, incluidas 'Cookie', 'User-Agent', 'Referer' y 'Host'. Sin embargo, en el navegador, la especificación W3C Fetch cataloga estas cabeceras como 'Forbidden Header Names' para prevenir ataques de falsificación de peticiones en sitios cruzados (CSRF) y robo de cookies. La función fetch del navegador descartará silenciosamente cabeceras 'Cookie' manuales; en su lugar, utiliza 'credentials: "include"' (o 'same-origin') para permitir que el gestor de cookies del navegador adjunte las credenciales de sesión automáticamente.

Problemas comunes y soluciones

⚠️TypeError: Failed to Fetch (Error de CORS en navegador mientras cURL funciona en terminal)

cURL es una herramienta de línea de comandos exenta de la Política de Mismo Origen (Same-Origin Policy). Al ejecutar fetch() en JavaScript del lado del cliente contra una API de terceros que no devuelve cabeceras 'Access-Control-Allow-Origin: *', el navegador bloquea la lectura de la respuesta. Para solucionarlo, invoca la API desde un servidor backend (Node.js, Route Handler de Next.js o Cloudflare Worker) donde no aplica CORS, o configura las cabeceras CORS adecuadas en el servidor de destino.

⚠️Unexpected Token in JSON at Position 0 al parsear el cuerpo de la respuesta

Este error ocurre al invocar 'await response.json()' en un endpoint que devuelve un cuerpo vacío (por ejemplo, 204 No Content), una página de error en HTML (como Cloudflare 502 Bad Gateway) o texto plano. Verifica siempre 'response.headers.get('content-type')?.includes('application/json')' antes de llamar a response.json(), o inspecciona 'const text = await response.text()' utilizando una captura segura con JSON.parse.

⚠️La subida de archivos multipart falla con 'No Boundary Found' en el servidor

Esto ocurre cuando se declara explícitamente 'Content-Type: multipart/form-data' en las cabeceras de fetch. Al usar FormData(), elimina por completo la cabecera 'Content-Type' del objeto headers. El navegador o el entorno Node.js inyectará automáticamente 'multipart/form-data; boundary=----WebKitFormBoundary...' con el delimitador multipart exacto calculado.

⚠️Fallo al parsear un comando cURL con saltos de línea con barra invertida

Al copiar comandos cURL multilínea de scripts bash o documentación técnica, los espacios posteriores a la barra invertida ('\ ') provocan que bash y los analizadores interpreten el salto de línea como texto literal y no como continuación de argumentos. Nuestro conversor normaliza automáticamente los tokens '\ ' y '\ ', limpiando espacios en blanco y fusionando fragmentos multilínea en una secuencia coherente de argumentos.

Preguntas frecuentes (FAQ)

¿Cómo convertir un comando cURL a código Fetch de JavaScript?▼

Para convertir un comando cURL a Fetch, extrae la URL de destino de la línea de comandos, asigna el flag -X a la propiedad 'method' de fetch (GET, POST, PUT, DELETE), transforma cada argumento -H en pares clave-valor dentro del objeto 'headers', estructura los datos de -d o --data mediante 'JSON.stringify(payload)' o 'new URLSearchParams(payload)' en la propiedad 'body', y encapsula la llamada en una función 'async/await' con 'const response = await fetch(url, options)'.

¿Por qué una petición cURL funciona en terminal pero falla por CORS en fetch?▼

cURL opera como un cliente HTTP directo sin el entorno de seguridad aislado del navegador, por lo que ignora la Política de Mismo Origen y las reglas de Cross-Origin Resource Sharing (CORS). Los navegadores modernos imponen CORS para impedir que aplicaciones web no autorizadas lean datos sensibles de otros orígenes. Si el servidor de destino no devuelve 'Access-Control-Allow-Origin' autorizando el origen de tu aplicación web, el navegador cancela la petición fetch. Para solucionarlo, canaliza la petición a través de un proxy backend o una ruta API serverless.

¿Cómo gestionar la autenticación Basic de cURL (-u usuario:contraseña) en Fetch?▼

En cURL, '-u usuario:contraseña' envía cabeceras HTTP Basic Authentication. En JavaScript Fetch para navegadores modernos, codifica las credenciales en Base64 mediante 'btoa("usuario:contraseña")' y añádelas como 'headers: { Authorization: `Basic ${btoa("usuario:contraseña")}` }'. En Node.js, utiliza 'Buffer.from("usuario:contraseña").toString("base64")' para generar exactamente el mismo valor estándar de cabecera.

¿Cómo enviar cookies en la API Fetch equivalentes al flag -b de cURL?▼

En el JavaScript del navegador, la cabecera 'Cookie' está catalogada como nombre de cabecera prohibido y no se puede configurar programáticamente en fetch() por directrices de seguridad. Para enviar las cookies almacenadas en el navegador hacia el dominio de destino, asigna 'credentials: "include"' en el objeto de opciones de fetch. En entornos de servidor Node.js (donde no aplican las restricciones del navegador), puedes enviar 'Cookie: session_id=xyz' directamente dentro del objeto headers.

¿Cuál es la diferencia entre -d, --data-raw y --data-urlencode de cURL en Fetch?▼

En cURL, '-d' y '--data-raw' transmiten la cadena exacta proporcionada, estableciendo por defecto el Content-Type en 'application/x-www-form-urlencoded' salvo que se anule mediante -H. En Fetch, si la carga útil es JSON, debes serializarla con JSON.stringify() y enviar 'Content-Type: application/json'. Si el comando cURL emplea '--data-urlencode', los valores de los parámetros se codifican en formato URL antes del envío, lo que en Fetch se resuelve de forma nativa pasando los pares clave-valor a 'new URLSearchParams({ key: value }).toString()'.

Herramientas y utilidades relacionadas

Todas las herramientas →