A. 痛点描述(Problem)#
几乎每个后端/前端的 README 或 API 文档里都会贴一段 curl 命令。但从 curl 到真正可用的代码,中间至少隔着四道坎:
- 看不懂参数:文档给的 curl 里
-H、-d、-G混在一起,不知道哪些改一下就能用; - 平台不兼容:从 macOS 文档里复制的 curl,直接贴到 Windows CMD 就报错(单引号、换行符差异);
- 语言差异大:老板让你"把这个接口调通",你拿着 curl 还得分别去查 JS/Python/Go 怎么写 HTTP 请求;
- 语法容错低:curl 里多一个空格、引号嵌套错一次,排查半天才发现是语法问题。
本文不教你怎么背参数,而是帮你理清 curl 的底层规则,再配合工具做一次性校验 + 多语言生成,真正的"一次粘贴,到处可用"。
工具入口:Curl 工具箱 👉 立即使用:Curl 工具箱
B. 核心原理(Deep Dive)——curl 参数体系的五个层次#
很多教程把 curl 参数列成一张大表让你背。但工程上更有用的是按语义层次理解它们,这样即使遇到没见过的参数也能快速归类。
第一层:请求方法与资源定位(-X / --url)#
curl -X POST https://api.example.com/users
-X指定 HTTP 方法(GET / POST / PUT / DELETE / PATCH / HEAD / OPTIONS)- 默认不写
-X时,curl 使用 GET - 但当存在
-d(数据体)时,curl 会自动把方法切为 POST
注意嵌套关系:如果 URL 本身已经包含 query 参数(?key=value),它会被保留;但如果用下文要讲的 -G 转换数据体,两者会合并,URL 末尾追加的数据体 query 优先级更高。
第二层:请求头(-H / --header)#
-H "Content-Type: application/json"
-H "Authorization: Bearer token123"
- 每个
-H一个请求头,可重复多次 - 格式必须是
Header-Name: value(冒号后有空格,但解析器会容错) - 值中若有双引号需要转义:
-H "Cookie: session=\"abc\""
常见踩坑:Windows CMD 中因为外层用双引号,内部的双引号需要写三个 """;推荐直接在工具里粘贴验证。
第三层:请求体(-d / --data)#
-d '{"name":"张三","email":"zhang@example.com"}'
-d发送原始数据,默认 Content-Type 是application/x-www-form-urlencoded- 要发 JSON,必须手动加
-H "Content-Type: application/json" --data-raw与-d类似,但不对@字符做文件读取--data-binary用于发送二进制数据,保留换行等空白字符-F(--form)用于 multipart/form-data,写法是-F "field=value"或-F "file=@/path/to/file"
引号嵌套的工程实践:
# 单引号包 JSON — bash 下推荐,内部双引号不需要转义
curl -d '{"key":"value"}' https://example.com
# 双引号包 JSON — 需要转义内部双引号
curl -d "{\"key\":\"value\"}" https://example.com
# Windows CMD — 必须双引号,内部双引号用 \" 转义
curl -d "{\"key\":\"value\"}" https://example.com
第四层:Query 参数(-G / --data-urlencode)#
# 把 -d 的数据转成 URL query 参数
curl -G -d "q=hello world" -d "lang=zh" https://example.com/search
# 实际请求:GET https://example.com/search?q=hello%20world&lang=zh
-G强制使用 GET 方法,并将-d的内容拼到 URL query--data-urlencode "key=value"是-d的 URL 编码版本,自动做百分号编码
第五层:认证与选项#
| 参数 | 含义 |
|---|---|
-u user:pass |
HTTP Basic Auth |
-b "cookie=value" |
发送 Cookie |
-k / --insecure |
跳过 SSL 证书验证(调试用,生产慎用) |
-L / --location |
自动跟随 301/302 重定向 |
-x proxy:8080 |
指定代理服务器 |
--compressed |
请求压缩传输 |
注意 -x 的大小写陷阱:curl 中 -x(小写)是代理,-X(大写)是请求方法。两者极易混淆,一个字母大小写错了,请求可能完全走偏。
C. 跨平台 curl 的差异(Windows vs macOS vs Linux)#
这是坑最多的地方。三者的差异集中在三个维度:
1)行续符#
# macOS / Linux (bash) — 反斜杠
curl -X POST https://example.com \
-H "Content-Type: application/json" \
-d '{"key":"value"}'
# Windows CMD — 脱字符
curl -X POST https://example.com ^
-H "Content-Type: application/json" ^
-d "{\"key\":\"value\"}"
# Windows PowerShell — 反引号 + curl.exe
curl.exe -X POST https://example.com `
-H "Content-Type: application/json" `
-d '{"key":"value"}'
2)引号策略#
| 平台 | 推荐引号 | 内部引号处理 |
|---|---|---|
| bash/zsh | 单引号 '...' |
内部双引号无需转义 |
| Windows CMD | 双引号 "..." |
内部双引号需 \" 转义 |
| PowerShell | 单引号 / 双引号均可 | 单引号内一切字面值 |
3)curl 别名#
Windows 10 1803 后系统自带 curl,但 PowerShell 中 curl 默认是 Invoke-WebRequest 的别名。写脚本时建议明确使用 curl.exe 以避免混淆。
D. 操作指南(Step-by-step)——用小算云箱一键搞定#
第一步:粘贴你的 curl 命令#
直接把多行 curl 粘贴到输入框。工具会自动:
- 折叠多行续行符(
\/^/`)为一行解析 - 去除行首
$或多余空格 - 校验引号配对、URL 格式、方法合法性
粘贴后,底部立刻显示"解析成功"或具体错误位置。
第二步:查看解析详情#
展开"解析详情"面板,你会看到结构化的信息:
- Method:GET / POST / PUT ...
- URL:分离后的纯 URL(query 参数单独列出)
- Headers:逐条展开
- Body Type:json / raw / form / multipart / none
- Query Params:包括来自
-G和--data-urlencode的 key-value
这一步相当于把 curl 做了一次"反编译",所有隐含的默认值(如不写 -X 时的自动 POST)都会被显式标注出来。
第三步:选择目标语言,复制代码#
支持 11 种语言 / 库的一键转换:
| JavaScript | Python | Go | Java | C# | Rust | PHP | Dart |
|---|---|---|---|---|---|---|---|
| fetch / axios | requests | net/http | OkHttp / HttpClient / Apache | HttpClient | reqwest | cURL | http |
代码输出区带有语法高亮,点击"复制"按钮即可粘贴到 IDE 中使用,无需二次编辑。
第四步:获取跨平台的等价 curl(含 wget)#
切到"跨平台 Curl / Wget"标签,工具自动输出四个平台的等价命令:
- Curl - Linux/macOS
- Curl - Windows CMD
- Curl - Windows PowerShell
- Wget - Linux/macOS
适合写多平台安装脚本或团队文档时使用。
E. 常见错误清单(快速对照)#
1)curl: (6) Could not resolve host#
URL 写错或域名拼写错误。检查是否遗漏了 https:// 前缀——没有协议的字符串 curl 不会自动补全。
2)curl: (3) URL using bad/illegal format#
通常是因为:
- URL 中包含未转义的特殊字符(如括号
()) - Windows CMD 中用了单引号
- 中文字符直接出现在 URL 中且未编码
3)curl: (7) Failed to connect#
- 目标服务未启动或端口不对
- 防火墙/代理拦截
- 在需要代理的内网环境未配置
-x参数
4)服务端返回 415 Unsupported Media Type#
99% 的情况是忘记加 -H "Content-Type: application/json" 导致的。curl 默认 Content-Type 是 application/x-www-form-urlencoded,如果你发 JSON 却不声明类型,服务端无法识别。
5)PowerShell 里 curl 不生效#
PowerShell 的 curl 实际上是 Invoke-WebRequest。直接用 curl.exe 或者执行 Remove-Item Alias:curl 来解除别名。
F. 常见问题(FAQ)#
1)curl 的 -d 和 --data-raw 有什么区别?#
--data-raw 不会将 @ 开头的字符串当作文件路径处理。如果你要发送一个恰好以 @ 开头的数据(如 @username),用 --data-raw 就不会被 curl 误读为读取文件。
2)为什么 curl 转成代码后,换行符和空格对不上?#
curl 中 \ 续行和多余空格都会在工具预处理时被忽略,生成的代码是标准格式化后的结果。如果你希望保留特定的缩进风格,可以复制后再用 IDE 的格式化工具调整。
3)-G 和 --data-urlencode 有什么不同?#
-G是把-d的数据转成 query 参数--data-urlencode单独指定一个 key=value 并做 URL 编码- 两者可以组合使用:
curl -G -d "q=hello" --data-urlencode "lang=zh"
4)curl 可以用 POST 发文件吗?#
可以。用 -F "file=@/path/to/file" 走 multipart/form-data,或用 --data-binary @/path/to/file 走原始二进制传输。前者会附带 Content-Type: multipart/form-data,后者需要你手动指定 Content-Type。
5)如何在 curl 里同时发送多个请求头?#
每个 -H 一个请求头:
curl -H "Content-Type: application/json" -H "Authorization: Bearer token" https://example.com
也可以一行写多个(不推荐,可读性差),工具解析后会自动拆分为多个独立 header。
工具推荐#
- Curl 工具箱(解析/校验/多语言转码):立即使用:Curl 工具箱
- JSON 工作台(请求体格式化/压缩):立即使用工具
- URL 编解码(参数百分号编码排错):立即使用:URL 编解码
- 时间戳转换(API 时间参数转换):立即使用工具