Saltar al contenido

Cómo convertir comandos cURL a JavaScript fetch y Python requests|Integración con DevTools

Categoría: HTTP / Desarrollo de API

Una tarea común en la depuración de API es "tomar un comando cURL de Chrome DevTools y convertirlo directamente al código". Este artículo explica la estructura de opciones de cURL, cómo funciona la función "Copy as cURL" de DevTools y patrones de conversión a lenguajes principales (JavaScript fetch / axios / Python requests / PHP cURL / Go net/http). Usando la herramienta de conversión de cURL introducida al final, puede convertir estos con un simple copiar-pegar.

Por qué empezar con cURL

Al implementar y depurar API, el flujo de trabajo común es primero 「verificar que funcione con curl antes de escribir código」. Las razones son las siguientes:

  • Independiente del lenguaje: curl es un lenguaje universal disponible en casi cualquier entorno
  • Copiar directamente desde DevTools: En la pestaña Network de Chrome / Firefox / Safari, haz clic derecho en una solicitud → Copy as cURL para obtener un comando completamente reproducible
  • Garantía de reproducibilidad: Al adjuntar un comando curl en reportes de errores o preguntas de Stack Overflow, otros pueden reproducir la solicitud exacta independientemente del entorno

Opciones principales de cURL

Las opciones esenciales de cURL se enumeran a continuación.

OpcionesCaso de usoEjemplo
-X / --requestEspecificación del Método HTTP-X POST
-H / --headerAgregar encabezado de solicitud-H "Content-Type: application/json"
-d / --dataCuerpo de la solicitud-d '{"id":1}'
--data-rawDatos sin procesar sin interpretación de escape--data-raw 'a=1&b=2'
-F / --formmultipart/form-data-F "file=@./a.png"
-u / --userAutenticación básica-u user:pass
-b / --cookieEnviar Cookie-b "session=abc"
-L / --locationSeguimiento de redirección
-k / --insecureOmitir verificación de certificado SSL (solo desarrollo)
--compressedAceptación de gzip

Qué obtienes del "Copy as cURL" de DevTools

Abra la pestaña Network en Chrome / Firefox / Edge, haga clic derecho en cualquier solicitud y verá la opción de menú Copy → Copy as cURL. Al hacer clic, se copia un comando completamente reproducido al portapapeles.

  • Método HTTP y URL Completa
  • Todos los encabezados de solicitud enviados (Authorization / User-Agent / Accept / Cookie, etc.)
  • Cuerpo de la solicitud (JSON / form-data / binary)
  • Escape mediante ANSI-C quoting ($'...')

Como punto a tener en cuenta, "Copy as cURL" de Firefox utiliza --data-raw, mientras que Chrome utiliza --data-binary, entre otras diferencias sutiles. Su herramienta de conversión debe estar implementada para reconocer ambos formatos.

Mapeo de opciones cURL a fetch cURL fetch -X POST method: 'POST' -H "Key: Val" headers: { Key: 'Val' } -d "body" body: 'body' -F file=@a.txt body: FormData --cookie credentials: 'include' -u user:pass Authorization: Basic
Fig 1: Correspondencia entre opciones principales de cURL y fetch

Convertir a JavaScript fetch

Aquí hay un ejemplo de una conversión típica de JSON POST.

# cURL
curl -X POST https://api.example.com/users \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -d '{"name":"Alice","email":"alice@example.com"}'
// JavaScript fetch
fetch('https://api.example.com/users', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_TOKEN',
  },
  body: JSON.stringify({ name: 'Alice', email: 'alice@example.com' }),
})
  .then(r => r.json())
  .then(console.log);

Versión de axios

import axios from 'axios';

axios.post(
  'https://api.example.com/users',
  { name: 'Alice', email: 'alice@example.com' },
  { headers: { 'Authorization': 'Bearer YOUR_TOKEN' } }
).then(r => console.log(r.data));

Convertir a Python requests

import requests

response = requests.post(
    'https://api.example.com/users',
    headers={
        'Content-Type': 'application/json',
        'Authorization': 'Bearer YOUR_TOKEN',
    },
    json={'name': 'Alice', 'email': 'alice@example.com'},
)
print(response.json())

La clave es usar json= en lugar de data=. Cuando especificas json=, requests serializa automáticamente a JSON y establece el Content-Type automáticamente.

Convertir a PHP cURL

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/users');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Authorization: Bearer YOUR_TOKEN',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'name'  => 'Alice',
    'email' => 'alice@example.com',
]));

$response = curl_exec($ch);
curl_close($ch);
echo $response;

Conversión a Go net/http

package main

import (
    "bytes"
    "io"
    "net/http"
)

func main() {
    body := bytes.NewReader([]byte(`{"name":"Alice","email":"alice@example.com"}`))
    req, _ := http.NewRequest("POST", "https://api.example.com/users", body)
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("Authorization", "Bearer YOUR_TOKEN")

    res, _ := http.DefaultClient.Do(req)
    defer res.Body.Close()
    data, _ := io.ReadAll(res.Body)
    println(string(data))
}

Advertencia: El hardcoding de tokens está estrictamente prohibido

Al convertir comandos cURL a código, tenga cuidado de no escribir directamente los valores del encabezado Authorization (tokens Bearer o claves API) en el código y hacer commit.

  • Leer tokens de producción a través de variables de entorno (process.env.API_TOKEN / os.environ['API_TOKEN'] / getenv())
  • Antes de confirmar, verifique con git diff que no haya información secreta incluida
  • Si ya fue confirmado, invalide el token inmediatamente (rotation) y reescriba el historial (git filter-repo)

Herramienta de conversión cURL de DevLab

La herramienta de conversión cURL ⇄ fetch / axios de DevLab ejecuta todas las conversiones anteriores con un solo clic, completamente en el navegador. Soporta 13 formatos de destino diferentes:

  • JavaScript: fetch / axios / node-fetch / https estándar de Node.js
  • Python: requests / urllib
  • PHP: cURL / file_get_contents
  • Go: net/http
  • Rust: reqwest
  • wget / HTTPie / PowerShell Invoke-WebRequest

Las opciones de cURL admiten -X -H -d --data-raw --data-binary --data-urlencode -F -u -b -A -e -L -k -I y ANSI-C quoting $'...', y aceptan la salida "Copy as cURL" de Chrome y Firefox directamente.

Resumen

cURL es extremadamente conveniente como lenguaje común de reproducción HTTP independiente del lenguaje, y cuando se combina con DevTools, permite reproducir inmediatamente solicitudes de API en producción. Si dominas los patrones de conversión mostrados en este artículo, puedes reproducir el mismo comportamiento desde cualquier idioma. La conversión manual es propensa a errores y omisiones (especialmente con Content-Type y escapes de comillas), por lo que recomiendo firmemente usar herramientas de conversión automática.

❓ Preguntas frecuentes

¿Puedo usar tal cual la salida de "Copy as cURL" de DevTools?
Sirve para reproducir una petición, pero nunca lo compartas tal cual. Las cabeceras Cookie y Authorization llevan tu sesión real, así que quien lo reciba puede actuar como tú. Elimina o sustituye por marcadores las cabeceras de autenticación antes de pegarlo en una incidencia o un chat.
¿curl -d es lo mismo que el body de fetch?
La carga puede ser idéntica, pero el Content-Type no. curl -d usa application/x-www-form-urlencoded por defecto si no se indica nada, mientras que fetch no pone ninguno. Si crees que envías JSON pero olvidas Content-Type: application/json en headers, el servidor ve un cuerpo vacío: la trampa más habitual al portar.
¿Cómo se traducen -L y -k de curl a fetch?
-L (seguir redirecciones) es el comportamiento por defecto de fetch, así que no hay nada que escribir; solo añades redirect: 'manual' cuando quieres detenerlo. No existe equivalente de -k (omitir la verificación del certificado) en el fetch del navegador, porque el navegador no ofrece forma de renunciar a la verificación TLS. Gestiona los certificados autofirmados desde Node.js o confiando un certificado de desarrollo.