Web y codificación · 5 minutos de lectura
cURL para recuperar: mover una solicitud del terminal al
Una conversión cURL para recuperar es la ruta habitual desde la documentación de un API hasta el código de interfaz funcional: la forma más rápida de entender un API es un comando cURL copiado de sus documentos, y la forma más rápida de enviarlo es `fetch`. La conversión entre ellos es principalmente mecánica (las banderas se asignan a un objeto de opciones), pero dos cosas rutinariamente interrumpen la traducción: las codificaciones del cuerpo y el modelo de seguridad del navegador que no tiene equivalente en una terminal.
Actualizado
Cómo se mapean las banderas
- `-X POST` → `method: "POST"` (o inferir el método a partir de `-d`).
- `-H "Content-Type: application/json"` → una entrada en `headers`.
- `-d '{"a":1}'` → `body: JSON.stringify(...)`; cURL lo envía codificado en formato a menos que indique lo contrario.
- `--data-binary @file` → un cuerpo `Blob`, `FormData` o `ArrayBuffer` en lugar de una cuerda.
- `-u user:pass` → un encabezado `Authorization: Basic …` construido a partir de la base64 de `user:pass`.
- `-F name=@file` → `FormData` con un `File`, que es como se expresan las cargas de archivos.
await fetch('https://api.example.com/v1/orders', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + token,
},
body: JSON.stringify({ sku: 'YB-1', qty: 2 }),
});
CORS: la parte en la que cURL nunca tuvo que pensar
cURL se ejecuta fuera del modelo de seguridad del navegador, por lo que puede llamar a cualquier host que responda. `fetch` en una página está sujeto a CORS: el servidor debe permitir su origen y, para cualquier cosa que vaya más allá de simples solicitudes, también debe responder correctamente a una verificación previa `OPTIONS`. Un comando convertido que funciona perfectamente en la terminal puede fallar en el navegador con un error de red opaco exactamente por esta razón, y ninguna edición del encabezado en la solicitud lo solucionará, porque el permiso debe provenir del servidor.
Si falla la recuperación con un mensaje CORS, la solución está en el API o en su proxy, no en JavaScript. Nunca solucione este problema poniendo una clave API en el código del cliente para “evitar” el problema.
Credenciales, redirecciones y streaming
Dos comportamientos más difieren del terminal. Las cookies no se envían a menos que pase `credentials: "include"` y el servidor debe responder con un origen explícito en lugar de un comodín. Los redireccionamientos van seguidos de forma predeterminada con `redirect: "follow"`, pero un redireccionamiento pierde el encabezado `Authorization` en todos los orígenes a menos que el servidor lo maneje, razón por la cual las llamadas autenticadas a menudo necesitan `redirect: "manual"` y un seguimiento deliberado. Las respuestas de transmisión se leen desde `response.body` como `ReadableStream`, donde cURL simplemente se imprime a medida que las recibe.
¿Buscar o axios?
`fetch` está integrado y funciona en todas partes de forma moderna; axios agrega conveniencia: análisis automático JSON, interceptores, un error legible para respuestas que no son 2xx, progreso de carga en tiempos de ejecución más antiguos. Un comando cURL convertido es un punto de partida confiable para: pegar las opciones generadas en una llamada axios y los encabezados y el cuerpo se mantienen sin cambios.
Convertir sin fugas
Los comandos cURL copiados de sesiones reales suelen llevar tokens portadores activos, claves API o cookies de sesión. Una conversión que se ejecuta en el navegador mantiene esas credenciales en su máquina, que es la única forma sensata de trabajar con una solicitud que usted no escribió.
enrollar para buscar — preguntas frecuentes
¿Por qué mi solicitud de recuperación convertida falla con un error CORS?
Porque el navegador aplica la política del mismo origen y cURL no. El API debe enviar el encabezado `Access-Control-Allow-Origin` apropiado y manejar las solicitudes de verificación previa. El proxy a través de su propio servidor es la solución estándar cuando un tercero API no permite los orígenes del navegador.
¿Cómo envío datos del formulario con fetch en lugar de JSON?
Utilice un objeto `FormData` como cuerpo y deje que el navegador establezca el límite multiparte; no establezca `Content-Type` usted mismo, porque el valor incluye un token de límite que genera el navegador. Esto también cubre la carga de archivos desde `-F` banderas.
¿Fetch envía cookies de forma predeterminada?
No. Las solicitudes del mismo origen incluyen cookies cuando se aplica `credentials: "same-origin"`, pero las llamadas entre orígenes necesitan `credentials: "include"` y el servidor debe responder con un origen explícito en lugar de un comodín para permitir que se lea la respuesta.
Herramientas mencionadas en esta publicación.
Más artículos para leer
5 minutos de lectura
Codificación URL: cuándo escapar y cuándo estás rompiendo
URL codifica y decodifica correctamente: caracteres reservados, más frente a %20, encodeURI frente a encodeURIComponent y los errores de doble codificación detrás de los enlaces rotos.
5 minutos de lectura
Base64 decodificar y codificar: para transporte, no para
Base64 decodifica y codifica en el navegador: la regla de tamaño 4/3, el relleno, la variante base64url y el error Unicode que hace que el texto decodificado parezca basura.
6 minutos de lectura
Formateador JSON: bonito, minimizado y realmente válido
Un formateador JSON que imprime, minimiza y valida con ubicaciones de error exactas, además de los cinco errores de sintaxis detrás de casi todos los errores JSON no válidos.