curl 实战:调接口、看响应、测时间的常用参数

curl 是排查网络问题的第一工具。参数很多,但高频的就那十来个。

一、最常用的组合

bash
# 只要响应头
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

二、看耗时:定位慢在哪一步

bash
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

输出例子:

bash
DNS解析: 0.012s
建立连接: 0.145s
TLS握手: 0.298s
首字节: 0.412s
总耗时: 0.430s

判读:

情况说明
namelookup 慢DNS 有问题
connect 慢网络链路差 / 被墙
appconnect 慢TLS 握手慢(证书链、OCSP)
starttransfer 慢服务端处理慢
total >> starttransfer响应体传输慢(内容太大)

一行版本:

bash
curl -o /dev/null -s -w "%{time_namelookup} %{time_connect} %{time_starttransfer} %{time_total}\n" https://www.bzii.cn

三、发 POST 请求

bash
# 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

bash
# 自定义头
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 相关

bash
# 看证书信息
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

bash
# 走代理
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 还没生效,就能验证新机器上的站点是否正常。

七、下载相关

bash
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

八、在脚本里用

bash
#!/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失败重试次数
-fHTTP 错误时返回非零退出码
-sS安静但显示错误

九、对比 wget

curlwget
定位传输数据、调接口下载文件
递归下载
各种协议支持多主要 HTTP/FTP
默认装大多数系统部分需装

排查问题用 curl,纯下载大文件用 wget(自带断点续传和递归)。

十、我的常用别名

bash
# ~/.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(看耗时)这五个,日常够用了。