cURL 转 fetch · 免费在线 curl 转 JavaScript fetch
免费在线 cURL 转 fetch 工具,把 curl 命令一键转成原生 fetch 代码,零依赖、浏览器和 Node 18+ 都能直接跑。生成结果是 await 风格:method、headers、body 组成配置对象,末尾用 await res.json() 取数据——fetch 不像 axios 会自动解析 JSON,这一步必须手动写。纯浏览器本地转换,不上传、免登录。
- 粘贴 curl 命令(本页已自动预选 fetch)。
- 检查「已忽略参数」提示。
- 复制生成的 fetch 代码到 async 函数或顶层 await 环境中。
- 按需补 res.ok 判断与超时控制。
为什么要写 await res.json()?
因为 fetch 返回的是 Response 对象而不是解析好的数据,必须再调一次 .json()(或 .text()/.blob())才能拿到内容,且这一步也是异步的。axios 则在内部就完成了解析,直接 res.data 即可。两者的这个差别是迁移代码时最容易漏的地方。
HTTP 404 或 500 会抛异常吗?
不会。fetch 只在网络层失败(断网、DNS 失败、CORS 被拦)时 reject,服务端返回 4xx/5xx 时 Promise 依然 resolve,res.ok 为 false。所以必须自己加 if (!res.ok) throw new Error(res.status) 之类的判断,否则错误响应会被当成正常数据继续往下走。
基础认证(-u)为什么是占位符?
因为 fetch 没有对应的配置项,只能自己拼 Authorization: Basic 头,值是 base64 编码后的 user:pass。浏览器端用 btoa("user:pass"),Node 端用 Buffer.from("user:pass").toString("base64")。生成结果留了占位提示,请替换成实际编码值或调用。
在浏览器里跑会不会被 CORS 拦?
会。fetch 受同源策略约束,目标服务没返回相应的 Access-Control-Allow-Origin 就会失败,而 curl 在命令行不受此限制——同一条命令 curl 通、浏览器不通是正常现象。需要带 Cookie 跨域还要加 credentials: "include",且服务端必须允许凭据。这类调试放到 Node 端跑更省事。
怎么给 fetch 加超时?
fetch 没有 timeout 选项,curl 的 --max-time 也不会转过来。现代环境用 signal: AbortSignal.timeout(10000) 最简洁;需要兼容旧环境则手工 new AbortController(),用 setTimeout 调 controller.abort() 并把 controller.signal 传进配置。