跳到主要内容

curl 命令转代码:从 DevTools 复制到 Python / JS / Go 的完整做法

把一条 curl 命令转成 Python requests、JavaScript fetch、Go net/http 代码,从浏览器开发者工具复制为 curl,处理 headers 和请求体,调试线上接口的实操指南。

发布于 作者 李雷
#curl #http #python #javascript #go #devtools #api

curl 命令转代码:从 DevTools 复制到 Python / JS / Go 的完整做法

我每天看到最多的一类 curl,不是自己敲的,是从别处复制来的:API 文档里给的现成示例、同事在群里贴的一坨、或者浏览器开发者工具里"复制为 cURL"导出的那条。这些 curl 用来在终端验证接口很顺手,但要把它放进项目代码,就得逐个把 -H 头、-d body 翻译成目标语言的写法,手转义引号,还容易漏掉一个 header。这篇说清楚整条链路:怎么拿到 curl,怎么把它准确转成 Python、JavaScript、Go 代码,以及 headers 和 body 各自的坑。

从浏览器 DevTools 把任意请求复制为 curl

这是最被低估的一步。你在网页上点了某个按钮,触发了一个接口请求,想把它搬进脚本,不用自己猜 URL 和参数。做法:打开浏览器开发者工具(F12),切到 Network 网络面板,刷新页面或触发那个操作,在请求列表里找到目标请求,右键它,选 Copy,再选 Copy as cURL(复制为 cURL)。Chrome、Edge、Firefox 都有这一项。

复制出来的就是一条完整 curl,带上了真实的 URL、全部请求头(包括 Cookie、Authorization、User-Agent)、以及 POST 的 body。它精确还原了浏览器实际发出去的那一次请求,比你照着文档手拼可靠得多。Chrome 还有 Copy as cURL (bash) 和 Copy as cURL (cmd) 两种,选 bash 那个,后面的解析才稳。

一个真实例子:curl 转 Python requests

假设从文档里拿到这条:

curl -X POST https://api.example.com/v1/messages \
  -H 'Authorization: Bearer sk-abc123' \
  -H 'Content-Type: application/json' \
  -d '{"model":"x","max_tokens":100}'

把它粘进 curl 命令转代码工具,目标语言选 Python,得到的是这样的 requests 代码:

import requests

resp = requests.post(
    "https://api.example.com/v1/messages",
    headers={
        "Authorization": "Bearer sk-abc123",
        "Content-Type": "application/json",
    },
    json={"model": "x", "max_tokens": 100},
)

注意几个细节:Content-Type 声明了 JSON 且 body 是合法 JSON,所以输出用的是 json= 字典而不是 data= 字符串,requests 会自动序列化并设头。如果 body 里有 true / false / null,会被转成 Python 的 True / False / None。这些手转的时候最容易写错。

headers 和 body 的处理细节

请求头方面,-H 是可重复的,每一个都原样进到目标语言的 headers 结构里,大小写保持不变。Authorization: Bearer … 直接穿过,不做改动。如果原命令用的是 -u user:pass 这种 basic 认证,转出来不会是手拼的 base64 串,而是各语言原生写法:Python 里是 auth=(user, pass),Go 里是 req.SetBasicAuth(...)

body 方面,多个 -d 会按 curl 自己的规则用 & 拼起来。只有当 Content-Type 声明 JSON 且 body 能解析时,才会美化成结构化形式;否则就当作转义后的原始字符串输出,不会自作主张。如果你想确认 body 里那段 JSON 本身格式对不对,可以先丢进 JSON 格式化工具校验一遍再转代码。

各语言的差异:JS fetch 与 Go net/http

同一条 curl,不同语言落地的写法差别不小。JavaScript fetch 里,JSON body 是 body: JSON.stringify({...}),headers 是普通对象;Go net/http 则要手动构造 http.NewRequest、用 strings.NewReader 包 body、逐个 req.Header.Set。Go 的 body 用反引号原始字符串字面量,万一你的 JSON 里正好含反引号(很少见),输出会插一个拼接断点保持代码合法,这一行值得扫一眼。把这些差异交给工具去对,比你在五种语法之间来回切记忆负担小得多。

调试线上接口的工作流

我自己常用的一条路是:在终端先用临时 curl 怼接口,加一个头、改一下 body,反复试到返回 200,这时手里这条 curl 就是确定能跑通的。然后把这条最终的 curl 转成 app 里要的语言,生成的代码就是那条请求的镜像,方法、头、body 全一致,不用我凭记忆从 shell 历史里拼回来。反过来,后端甩一条打内部服务的 curl,前端要 fetch 版本,粘进去复制输出就完事,省掉"请求头大小写到底咋写"的来回。

有一点要提醒:这条转换链路全在浏览器本地跑,不发请求也不上传。但 curl 文本会编码进可分享的 URL,如果命令里含 bearer token 或 API key,别直接把分享链接贴去 Slack,手动复制生成的代码,或先把凭据删掉再分享。

把 curl 当作请求的中间表示,DevTools 负责抓,工具负责翻译,你只管选目标语言。一条从浏览器复制来的请求,几秒钟就能变成项目里能跑的代码。


Made by Toolora · Updated 2026-06-13