HandyTools Hub

cURL 转换器

将 cURL 命令转换为 fetch、axios 或 Python 代码

粘贴一段 cURL 命令,转换器会把它解析成结构化请求,再分别用三种 HTTP 客户端写成可运行的代码。它面向的是日常场景:从 Chrome 开发者工具、API 参考页或 bug 报告里复制一条请求,直接放进应用代码,而不必手工翻译方法、请求头和 JSON 转义。

转换器实际输出什么

每次转换固定产生三个输出,各自占一个标签页:

  • JavaScript fetch —— 浏览器原生 API,使用 headers 对象和 body 字符串。
  • JavaScript axios —— 一个配置对象,包含 method、url、headers、可选的 data 和可选的 auth。
  • Python requests —— 先 import requests,可选的 headers 与 data 变量,最后调用 requests.request(...)。

没有 cURL 转 Go、Ruby、PHP、C# 或 HTTPie 的输出,也没有反向的「代码转 cURL」。三段代码在同一次转换中生成,切换标签是瞬时的,不需要二次转换。

每个目标都保留自己的惯用写法,而不是共用一套通用模板。fetch 在请求是普通 GET 时会省略 method 字段,并追加 .then(...) 调用链;axios 始终写出配置对象,并把方法名转成小写;Python 会在调用前先构造具名的 headers 和 data 变量。因为生成器基于同一份解析结果,三者的 URL、请求头名和 body 字符串完全一致——变的只是包裹它们的语法。

使用方法

粘贴以 curl 开头的完整命令。分词器能识别反斜杠换行续行、单引号字符串,以及带转义引号的双引号字符串,所以从开发者工具复制的多行命令可以原样使用。点击转换,如果出现警告面板就先读一遍。切换标签页,复制需要的代码片段。解析与代码生成都在页面内完成,命令及其中的凭据都留在你的设备上。

转换器在设计上很宽容:一条横跨十几行、带制表符、行尾反斜杠和混合引号风格的开发者工具命令,会按浏览器发出的原样解析。如果结果看起来不对,先查警告列表,因为它会列出解析器无法归类的每一个记号。每个输出面板上方都有复制按钮,复制的内容与所见一致,包括 fetch 片段上的 .then 调用链。

实操示例:一条开发者工具命令,三种目标

工具内置的示例是一条典型的「复制为 cURL」请求:

curl 'https://api.example.com/v1/users' \
  -H 'accept: application/json' \
  -H 'authorization: Bearer your-token-here' \
  -H 'content-type: application/json' \
  --data-raw '{"name":"Alice","role":"developer"}' \
  --compressed

解析器因为存在 -d 系列参数、且没有 -X 覆盖,推断出 POST。URL 原样保留,三个请求头按顺序保留,请求体就是那段精确的 JSON 字符串。会报告一条警告:Unknown flag: --compressed。

对 fetch 来说,值得注意的是 method 字段、headers 对象,以及被引号包裹的 JSON 字符串 body:

fetch("https://api.example.com/v1/users", {
  method: "POST",
  headers: { "accept": "application/json", "authorization": "Bearer your-token-here", "content-type": "application/json" },
  body: "{\"name\":\"Alice\",\"role\":\"developer\"}",
});

axios 版本对应地写成 method: "post"、url、headers 和 data。Python 版本先声明 headers = {...}、data = '...',再调用 requests.request("POST", "https://api.example.com/v1/users", headers=headers, data=data)。在每个目标里 body 都是字符串,而不是解析后的对象;转换器原样保留载荷,不做重新解释。

支持的参数与会被跳过的参数

cURL 参数对解析后请求的影响
-X、--request设定 HTTP 方法,并转为大写
-H、--header添加一个请求头,在第一个冒号处切分
-d、--data、--data-raw、--data-binary、--data-ascii追加到请求体;多个部分用 & 连接
-u、--user记录基本认证凭据
-A、--user-agent添加或替换 User-Agent 头
-G、--get把数据移入查询字符串并使用 GET
-I、--head使用 HEAD
--url显式提供 URL

表中没有的任何参数——--compressed、--insecure、-k、-L、--max-time、cookie 存储、-F 文件上传等等——都会被有意跳过。这些参数会收集进输出上方的警告列表,让你清楚看到跳过了什么,同时仍能使用生成的代码。缺少冒号的请求头,或没有参数值的选项,也只会产生警告而不是错误。唯一的硬性失败是命令里找不到可识别的 URL,此时会提示未找到 URL。

认证信息如何重写

来自 -u user:password 的凭据会转换成各目标的惯用机制。fetch 得到 "Authorization": "Basic " + btoa("user:password");axios 得到 auth: { username: "user", password: "password" };Python 得到 auth=("user", "password")。如果命令中已经含有 Authorization 头,生成器会保留该头,不会再叠加基本认证。由于凭据会被写进输出,凡是用了 -u 的代码片段都应视为敏感信息。

常见错误与局限

  • 多个 -d 段会用 & 拼接。 这通常对应 application/x-www-form-urlencoded,但无法复现带文件分片的 multipart/form-data。
  • 未知参数会被丢弃。 --cookie 会话、跟随重定向、绕过 TLS 校验都不会出现在生成的代码里,尽管请求本身可能会成功。
  • -G 会改变 data 的含义。 拼接后的数据会移入查询字符串,输出的请求完全没有请求体。
  • 方法推断可能出乎意料。 带请求体且没有 -X 的命令会变成 POST;如果你其实想要 GET,请加上 -X GET 或 -G。
  • 请求体始终是字符串。 想要干净的对象字面量,可把输出粘进编辑器,手动替换掉转义过的字符串。

相关工具

常见问题

可以生成哪些语言的代码?

固定三种:JavaScript fetch、JavaScript axios 和 Python requests。没有 cURL 转 Go、Ruby、PHP、C# 或 HTTPie 的输出,也没有从代码反向生成 cURL 的功能。三段代码在同一次转换中一并生成,切换标签页不需要再转一次。

转换器不认识的 --compressed 这类参数会怎样?

它们会被收集进输出上方的警告列表,而不是让转换失败。--compressed、--insecure、-k、-L、--max-time、cookie 存储以及 -F 文件上传等参数都不会被翻译,警告会逐条告诉你跳过了什么。

多个 -d 或 --data 参数是如何处理的?

每个值都会追加到请求体,各段之间用 & 连接,这与 cURL 发送重复 data 参数的行为一致。如果用了 -G 或 --get,拼接后的数据会改为追加到 URL 的查询字符串上,不再生成请求体。

-u user:password 是如何转换的?

基本认证会按目标客户端的习惯写法生成:fetch 用 btoa 构造 Authorization 头,axios 用 auth: { username, password },Python 用 auth=("user", "password")。如果命令里本来就有 Authorization 头,则保留该头,不再额外添加基本认证。

HTTP 方法是怎么决定的?

显式的 -X/--request 优先。否则 -I/--head 表示 HEAD,带 data 参数且没有 -G 表示 POST,其余都是 GET。因此一个带请求体、却没写 -X 的命令会变成 POST,这是最常见的意外。

唯一会中断转换的错误是什么?

命令里找不到可识别的 URL。未知参数、缺少冒号的畸形请求头、以及缺少参数值的选项,都只会产生警告,代码依然会生成。

由 HandyTools Hub 团队审校 · 最后更新