curl 命令怎么用?我平时调接口基本靠它
只要你平时写接口、联调前后端,或者经常和 HTTP 请求打交道,curl
这个命令基本躲不过。
我第一次接触它的时候,其实有点抗拒。 一串参数堆在一起,看着就不像什么“友好工具”:
curl -X POST https://example.com/api \
-H "Content-Type: application/json" \
-d '{"name":"Tom"}'
但用久了之后会发现,这东西是真的省事。
很多时候我只是想确认一个接口通不通、参数有没有带对、服务端到底回了什么。 这种场景下,开 Postman 有点重,专门写个页面更没必要,直接一条 curl 就够了。
这篇文章不打算讲太多官方定义,就按平时最常用的场景过一遍。 目标也很直接:看完之后,你至少能自己写出常见的 GET、POST、带 JSON、带 token 的请求。
先把 curl 想简单一点
你可以把 curl 理解成一句话:
它就是在命令行里发 HTTP 请求。
比如这条命令:
curl -X POST example.com/api/users
-H "Content-Type: application/json"
-d '{"name":"Tom","age":18}'
别看它长,其实就是在说:
- 我要发一个 POST
- 地址是 example.com/api/users
- 请求头里告诉服务端:我传的是 JSON
- 请求体里有一段数据
说白了,它不是新东西,只是把平时接口请求的那些信息换成了命令行写法。
- 最基本的用法:直接请求一个地址
最简单的写法就是:
curl example.com
默认就是 GET 请求。
如果这个地址返回的是网页,你会在终端里看到 HTML。 如果这是个接口,通常会返回 JSON。
比如拿这个站点练手就挺方便:
curl httpbin.org/get
它会把你这次请求的信息再回给你,刚入门的时候很适合拿来试。
- 如果想看响应头,用 -i
有时候你不只是想看返回内容,还想知道:
- 状态码是多少
- 返回了哪些 header
- 有没有发生跳转
这时候就加个 -i:
curl -i example.com
它会把响应头和响应体一起打出来。
如果你只想看响应头,不关心正文,那就用:
curl -I example.com
这个我平时查接口状态挺常用的。
- 指定请求方法:-X
虽然 curl 默认就是 GET,但实际开发里,更多时候还是发 POST、PUT、DELETE。
发 POST
curl -X POST example.com/api/users
发 PUT
curl -X PUT example.com/api/users/1
发 DELETE
curl -X DELETE example.com/api/users/1
-X 就是指定请求方法。
不过如果本来就是 GET,就别特地写 -X GET 了,没必要。
- URL 上带参数
比如分页接口,经常会这么写:
curl "example.com/api/users?p…"
这里最好带上双引号。 因为 URL 里如果有 &,shell 可能会把它当成别的东西处理。
这是个小细节,但新手确实很容易踩这个坑。
- 发 JSON 请求,这是最常见的
平时调接口,最常见的就是发 JSON。
比如新增一个用户:
curl -X POST example.com/api/users
-H "Content-Type: application/json"
-d '{"name":"Tom","age":18}'
这里就两个关键参数:
- -H:加请求头
- -d:带请求体数据
如果你传的是 JSON,通常都别忘了这一句:
-H "Content-Type: application/json"
不然有些后端会按表单去解析,最后表现出来就是: 命令是跑了,但服务端拿到的数据不对。
这种问题我自己刚接触接口的时候没少遇到。
- 发表单也行
除了 JSON,表单请求也很常见。
普通表单提交
curl -X POST example.com/login
-d "username=tom&password=123456"
这种就是最普通的表单格式。
上传文件
如果是上传文件,用 -F:
curl -X POST example.com/upload
-F "file=@./test.png"
这个 @ 很关键,表示上传本地文件。
如果还要额外传点别的字段,也可以一起带:
curl -X POST example.com/upload
-F "file=@./test.png"
-F "userId=123"
这在测试上传接口的时候很方便,不用专门写个页面。
- 带 token 鉴权
现在很多接口都会要求带 token。
比如 Bearer Token:
curl example.com/api/profile
-H "Authorization: Bearer YOUR_TOKEN"
这个写法很常见,平时调用需要登录态的接口时基本都会碰到。
如果是最基础的账号密码认证,也可以这么写:
curl -u username:password example.com/api/profile
- 下载文件
curl 不只是拿来调接口,也能直接下载东西。
用远程文件名保存
curl -O example.com/file.zip
自己指定保存名
curl -o myfile.zip example.com/file.zip
区别不复杂:
- -O 用服务端原始文件名
- -o 用你自己写的名字
- 有跳转时记得加 -L
有些地址会 301、302 跳到另一个地址。 这时候如果你不加参数,可能拿到的只是跳转响应,不是最终内容。
所以很多时候我会顺手加上:
curl -L example.com
-L 的意思就是跟着跳转继续请求。
这个参数看起来不起眼,但挺实用。
- 查问题时,-v 很有用
如果你怀疑请求哪里不对,最直接的方法就是开详细模式:
curl -v example.com
这样你能看到很多过程信息,比如:
- 实际发了哪些请求头
- 服务端回了什么
- 有没有发生重定向
- TLS 握手有没有问题
有时候接口调不通,不一定是后端挂了,也可能是你 header 写错了,或者请求根本没按你以为的方式发出去。 这种时候 -v 很顶用。
- 只看状态码
有时候我只是想快速确认一个接口是不是 200,不想看一大坨响应内容。
这种时候会这么写:
curl -o /dev/null -s -w "%{http_code}\n" example.com
输出就只有一个状态码,比如:
200
这条命令看着稍微有点“命令行味儿”,但在脚本里特别常用。
简单理解就是:
- 返回体不要了
- 过程别啰嗦
- 最后只告诉我状态码
- Cookie 也能带
如果接口依赖 Cookie,也能直接处理。
手动带 Cookie
curl example.com
-H "Cookie: sessionId=abc123"
先保存,再复用
curl -c cookies.txt example.com/login curl -b cookies.txt example.com/profile
- -c:保存 Cookie
- -b:读取 Cookie
如果你想模拟登录后的请求,这种方式挺省事。
- 本地 HTTPS 有问题时,可以先用 -k
有时候本地环境的 HTTPS 证书不规范,直接请求会报错。
这时候可以先跳过校验:
curl -k https://localhost:8443
这个参数平时开发阶段偶尔会用到。 但线上环境还是别这么搞,能校验证书还是要校验。
- 为什么我觉得它特别适合 Claude Code CLI 这种环境
我自己一直没把 curl 换掉,还有个很现实的原因: 如果你本来就在命令行里工作,它会特别顺手。
像 Claude Code CLI 这种环境,本来很多事情就在终端里完成:
- 看代码
- 改代码
- 跑测试
- 查日志
- 启服务
- 验接口
这时候如果还专门切到浏览器或者别的图形界面工具,多少会打断一点节奏。 反而是 curl 这种命令行工具,更容易直接接进整个工作流里。
比如你刚改完一个接口,想确认服务是不是正常返回,顺手就是一条:
curl -i "http://localhost:3000/api/users"
如果要测带 token 的请求,也可以马上补一条:
curl "http://localhost:3000/api/profile"
-H "Authorization: Bearer your_token"
这种体验挺适合 CLI 驱动的开发方式。 你不用离开当前上下文,改完代码就验证,验证完继续改。整个过程是连着的。
所以对我来说,curl 不只是一个“会用就行”的命令。 在 Claude Code CLI 这种环境里,它更像是一个很基础、很顺手的日常工具。
- 新手先记住这几个参数就够了
刚开始学 curl,不用想着一次全记住。 先把下面这些高频参数混熟,已经够用了:
┌──────┬─────────────────────┐ │ 参数 │ 作用 │ ├──────┼─────────────────────┤ │ -X │ 指定请求方法 │ ├──────┼─────────────────────┤ │ -H │ 添加请求头 │ ├──────┼─────────────────────┤ │ -d │ 发送请求体 │ ├──────┼─────────────────────┤ │ -F │ 上传文件 / 表单提交 │ ├──────┼─────────────────────┤ │ -i │ 显示响应头和响应体 │ ├──────┼─────────────────────┤ │ -I │ 只看响应头 │ ├──────┼─────────────────────┤ │ -L │ 跟随重定向 │ ├──────┼─────────────────────┤ │ -o │ 保存到指定文件 │ ├──────┼─────────────────────┤ │ -O │ 用远程文件名保存 │ ├──────┼─────────────────────┤ │ -v │ 显示详细过程 │ ├──────┼─────────────────────┤ │ -s │ 静默模式 │ ├──────┼─────────────────────┤ │ -u │ Basic Auth │ ├──────┼─────────────────────┤ │ -k │ 忽略 HTTPS 证书校验 │ └──────┴─────────────────────┘
我自己的感觉是,-H、-d、-X、-L、-v 这几个用得最多。
- 几个特别容易踩的坑
1)URL 里有 &,没加引号
错误写法:
更稳一点:
curl "example.com/api?a=1&b=2"
2)传 JSON,但没写 Content-Type
错误写法:
curl -X POST example.com/api
-d '{"a":1}'
更稳的写法:
curl -X POST example.com/api
-H "Content-Type: application/json"
-d '{"a":1}'
3)命令没报错,不代表请求就对了
这个真的挺常见。
curl 能执行成功,只说明命令格式没问题。 但服务端到底有没有收到你想传的内容,还是得看响应、状态码,必要时开 -v。
有时候问题不是接口挂了,而是你自己 header 少写了一个。
- 平时最常用的几个模板
GET 请求
curl "api.example.com/users?page=…"
POST JSON
curl -X POST "api.example.com/users"
-H "Content-Type: application/json"
-d '{"name":"Alice","email":"alice@example.com"}'
带 token
curl "api.example.com/me"
-H "Authorization: Bearer abcdefg"
上传文件
curl -X POST "api.example.com/upload"
-F "file=@./demo.pdf"
只看响应头
curl -I "example.com"
- 最后说个我自己的感受
学 curl 这件事,重点不是把所有参数都背下来。
重点是你先知道一个 HTTP 请求到底由什么组成:
- 方法
- 地址
- 请求头
- 请求体
这个想通之后,curl 就没那么吓人了。 它本质上只是把这些东西翻译成命令而已。
而且如果你本来就习惯在命令行里工作,比如在 Claude Code CLI 这种环境下写代码、跑测试、查服务,那 curl 会特别顺手。 你不需要切换工具,改完代码就能直接验证接口,整个节奏是连着的。
它不一定是最花哨的工具,但很多时候,它真的是最快的那个。