curl 实战:调接口、看响应、测时间的常用参数
curl 是排查网络问题的第一工具。参数很多,但高频的就那十来个。
一、最常用的组合
# 只要响应头
curl -I https://www.bzii.cn
# 跟随重定向(很多场景必须加)
curl -IL https://www.bzii.cn
# 安静模式:不要进度条
curl -s https://www.bzii.cn
# 输出详细信息(看握手、请求头、响应头)
curl -v https://www.bzii.cn
# 只看状态码(脚本里用)
curl -s -o /dev/null -w "%{http_code}\n" https://www.bzii.cn二、看耗时:定位慢在哪一步
curl -o /dev/null -s -w "DNS解析: %{time_namelookup}s\n
建立连接: %{time_connect}s\n
TLS握手: %{time_appconnect}s\n
首字节: %{time_starttransfer}s\n
总耗时: %{time_total}s\n" https://www.bzii.cn输出例子:
DNS解析: 0.012s
建立连接: 0.145s
TLS握手: 0.298s
首字节: 0.412s
总耗时: 0.430s判读:
| 情况 | 说明 |
|---|---|
| namelookup 慢 | DNS 有问题 |
| connect 慢 | 网络链路差 / 被墙 |
| appconnect 慢 | TLS 握手慢(证书链、OCSP) |
| starttransfer 慢 | 服务端处理慢 |
| total >> starttransfer | 响应体传输慢(内容太大) |
一行版本:
curl -o /dev/null -s -w "%{time_namelookup} %{time_connect} %{time_starttransfer} %{time_total}\n" https://www.bzii.cn三、发 POST 请求
# JSON
curl -X POST https://api.example.com/login \
-H "Content-Type: application/json" \
-d '{"user":"admin","pass":"xxx"}'
# 表单
curl -X POST https://api.example.com/form \
-d "name=baize" -d "type=site"
# 上传文件
curl -F "file=@/path/to/file.png" https://api.example.com/upload
# 从文件读 body
curl -X POST --data-binary @payload.json -H "Content-Type: application/json" URL
# PUT / DELETE
curl -X PUT -d @data.json URL
curl -X DELETE URL四、请求头与 Cookie
# 自定义头
curl -H "Authorization: Bearer $TOKEN" -H "X-Trace: 1" URL
# 指定 UA(有些站点会拦默认 UA)
curl -A "Mozilla/5.0 (compatible; Bot)" URL
# 指定 Host(测试虚拟主机很有用)
curl -H "Host: www.bzii.cn" http://1.2.3.4/
# Cookie
curl -b "session=abc" URL # 发送
curl -c cookies.txt URL # 保存
curl -b cookies.txt -c cookies.txt URL # 保持会话
# Referer
curl -e "https://www.bzii.cn/" URL五、HTTPS 相关
# 看证书信息
curl -vI https://www.bzii.cn 2>&1 | grep -iE "subject|issuer|expire"
# 更详细:用 openssl
echo | openssl s_client -connect www.bzii.cn:443 -servername www.bzii.cn 2>/dev/null | openssl x509 -noout -dates -subject
# 忽略证书校验(仅测试自签证书,别养成习惯)
curl -k https://self-signed.local/
# 指定 CA
curl --cacert /path/to/ca.pem https://www.bzii.cn
# 强制 IPv4 / IPv6
curl -4 https://www.bzii.cn
curl -6 https://www.bzii.cn
# 指定 HTTP 版本
curl --http1.1 https://www.bzii.cn
curl --http2 https://www.bzii.cn
curl --http3 https://www.bzii.cn
# 看协商结果
curl -v --http2 https://www.bzii.cn 2>&1 | grep -i alpn六、调试代理与 DNS
# 走代理
curl -x http://127.0.0.1:7890 https://www.bzii.cn
curl --socks5 127.0.0.1:1080 https://www.bzii.cn
# 跳过代理
curl --noproxy "*" https://www.bzii.cn
# 把域名解析到指定 IP(测试新服务器必备)
curl --resolve www.bzii.cn:443:1.2.3.4 https://www.bzii.cn/
# 指定 DNS 服务器
curl --dns-servers 1.1.1.1 https://www.bzii.cn
--resolve是迁移服务器时的神器:DNS 还没生效,就能验证新机器上的站点是否正常。
七、下载相关
curl -O https://example.com/file.tar.gz # 保持原文件名
curl -o out.zip https://example.com/x # 指定文件名
curl -C - -O URL # 断点续传
curl -L -o out.iso URL # 跟随重定向下载
curl --limit-rate 1M -O URL # 限速
# 下载并显示进度(默认有进度条,-s 会关掉)
curl -# -O URL八、在脚本里用
#!/usr/bin/env bash
set -euo pipefail
URL="https://www.bzii.cn/health"
# 超时控制(很重要,否则脚本会卡死)
code=$(curl -s -o /dev/null -w "%{http_code}" \
--connect-timeout 5 --max-time 15 "$URL" || echo "000")
if [ "$code" = "200" ]; then
echo "正常"
else
echo "异常,状态码 $code" >&2
exit 1
fi
# 重试(--retry 很实用)
curl --retry 3 --retry-delay 2 --retry-connrefused -sS URL关键参数:
| 参数 | 说明 |
|---|---|
--connect-timeout N | 连接超时秒数 |
--max-time N | 整个请求最长秒数 |
--retry N | 失败重试次数 |
-f | HTTP 错误时返回非零退出码 |
-sS | 安静但显示错误 |
九、对比 wget
| curl | wget | |
|---|---|---|
| 定位 | 传输数据、调接口 | 下载文件 |
| 递归下载 | ❌ | ✅ |
| 各种协议 | 支持多 | 主要 HTTP/FTP |
| 默认装 | 大多数系统 | 部分需装 |
排查问题用 curl,纯下载大文件用 wget(自带断点续传和递归)。
十、我的常用别名
# ~/.bashrc
alias curlt='curl -o /dev/null -s -w "dns=%{time_namelookup} conn=%{time_connect} ttfb=%{time_starttransfer} total=%{time_total} code=%{http_code}\n"'
alias curls='curl -s -o /dev/null -w "%{http_code}\n"'记住 -s(安静)、-I(只要头)、-L(跟重定向)、--resolve(指定 IP)、-w(看耗时)这五个,日常够用了。
