curl 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
curl——网络进阶与压测命令族(见网络进阶命令族)。调试接口、验证服务、下载文件,几乎离不开它。
curl(Client URL,客户端 URL 工具)是命令行里最通用的网络传输工具。它能发任意 HTTP 方法、带自定义头、传 body、跟重定向、忽略证书——是验证"服务到底通不通、接口返了啥"的第一工具,比打开浏览器/postman 快得多。
一、最常用:GET 与下载
curl https://api.example.com/status # GET,输出响应体到屏幕
curl -i https://api.example.com/status # -i 连响应头一起打印
curl -I https://api.example.com/status # -I 只取响应头(HEAD)
curl -o out.json https://api.example.com/d # -o 存成文件
curl -O https://example.com/file.zip # -O 用远端文件名保存
-i把响应头和体一起打出来,调试时必用——很多时候问题不在 body 而在Content-Type、Set-Cookie或状态码。-I只发 HEAD 请求看头,测"资源在不在、多大、啥类型"最快。下载大文件用-O(保留原名)或-o 指定名。
二、发 POST 与自定义请求
curl -X POST https://api.example.com/login \
-H "Content-Type: application/json" \
-d '{"user":"admin","pass":"x"}' # -d 发 body
curl -X POST url -d "a=1&b=2" # 表单格式
curl -X PUT url -H "Authorization: Bearer xxx" -d @payload.json # body 从文件读
-X指定方法(GET/POST/PUT/DELETE),-H加请求头(可多个),-d带请求体。-d @file从文件读 body,长 JSON 别手敲。注意-d默认会把方法变成 POST 并设application/x-www-form-urlencoded,发 JSON 务必显式加-H "Content-Type: application/json",否则服务端解析会出错。
三、跟随重定向与忽略证书
curl -L https://example.com # -L 跟随 3xx 重定向
curl -k https://self.signed/ # -k 忽略 SSL 证书校验(仅测试用)
curl -u user:pass https://api/ # -u 基础认证访问内部自签证书的测试环境,
curl默认会因证书不信任报错,加-k跳过校验——仅限测试,生产环境绝不要-k,那是明文中间人风险的源头。对外网正式接口,certificate 校验(确认对方身份的数字证书链)必须开着。
四、看耗时与连接指标:-w
curl -o /dev/null -s -w "time_total: %{time_total}s\n" https://api.example.com
curl -w "dns:%{time_namelookup} connect:%{time_connect} ttfb:%{time_starttransfer}\n" url
-w(write-out)能输出一堆计时变量:time_namelookup(DNS)、time_connect(TCP 建连)、time_starttransfer(首字节 TTFB)、time_total(总耗时)。配合-o /dev/null -s(丢弃 body、静默)专门测性能,是接口慢在哪层的定位利器——TTFB 高说明服务端处理慢,connect 高说明网络/握手慢。
五、和 jq 解析 JSON
curl -s https://api.example.com/user/1 | jq '.name, .email'
curl -s url | jq -r '.items[] | "\(.id) \(.name)"'接口返回 JSON 时,直接 jq 抽取字段(见 jq 详解),比 grep 正则稳得多——JSON 格式一变正则就崩,jq 按结构取。写监控、巡检脚本时这套
curl | jq组合是标配。
六、实战:排查一个 500 接口
# 1. 先看响应头和状态码
curl -i -X POST https://api.example.com/order -H "Content-Type: application/json" -d @order.json
# 2. 看耗时分布,判断是网络还是服务端慢
curl -o /dev/null -s -w "total:%{time_total} ttfb:%{time_starttransfer}\n" url
# 3. 加 -v 看完整请求/响应往返(含 SSL 握手细节)
curl -v url-v(verbose)会打印出请求行、所有头、SSL 握手过程,接口对接联调时几乎天天用。配合抓包(tcpdump)能彻底看清一次 HTTP 交互的全貌。
七、进阶:上传、认证与重试
接口调试不止 GET/POST,这几类场景同样高频:
# 1. 上传文件(multipart)
curl -F "file=@photo.jpg" https://api.example.com/upload
# 2. Basic / Bearer 认证
curl -u user:pass https://api.example.com/me
curl -H "Authorization: Bearer $TOKEN" https://api.example.com/me
# 3. 带重试与超时(生产调用必须设,否则卡死)
curl --retry 3 --retry-delay 2 --connect-timeout 5 --max-time 30 url
# 4. 走代理(内网服务经跳板)
curl -x socks5h://127.0.0.1:1080 https://internal/api
# 5. 把响应存文件同时看头(-D 存响应头)
curl -o body.json -D headers.txt https://api.example.com/data--retry + --max-time 是脚本里调用外部接口的安全底线:不设超时,对方一卡你的任务就挂起几小时;不设重试,偶发网络抖动就误报失败。-x 配合 ssh 的 SOCKS 代理,可以在本机直接打内网接口。
八、性能定位的字段清单
-w 能输出的计时字段是排查"慢在哪"的关键,挑常用的:
| 变量 | 含义 |
|---|---|
%{time_namelookup} | DNS 解析耗时 |
%{time_connect} | TCP 建连耗时 |
%{time_starttransfer} | TTFB(首字节,服务端处理+网络) |
%{time_total} | 总耗时 |
%{size_download} | 下载字节数 |
curl -s -o /dev/null -w "dns:%{time_namelookup} conn:%{time_connect} ttfb:%{time_starttransfer} total:%{time_total}\n" urltime_connect 大=网络/握手问题;time_starttransfer - time_connect 大=服务端处理慢。一眼分清"网络慢还是服务慢"。
一次 HTTP 的耗时拆解:DNS/建连 → 服务端处理(TTB)→ 传 body。用
-w把三段分开,慢因立刻现形。
相关命令
一句话总结
curl = 命令行 HTTP 瑞士军刀:-i/-I 看响应头/只看头、-X/-H/-d 构造任意请求(JSON 务必带 Content-Type)、-o/-O 下载、-L 跟重定向、-k 仅测试忽略证书、-w 输出 DNS/连接/TTFB/总耗时做性能定位;配合 jq 解析 JSON、ssh 进内网,是接口调试与服务验证的第一工具。