06 curl 命令行工具 - 接口调试的终极利器
🎯 本章目标:掌握curl命令的各种用法,能够在命令行中完成所有接口测试操作。
6.1 什么是curl
curl 是一个命令行工具,用于在客户端与服务器之间传输数据,支持多种协议(HTTP、HTTPS、FTP等)。
为什么学curl
- 无需安装GUI
- 脚本化自动化
- 服务器环境必备
- 快速调试
- 管道组合
场景:
- 服务器上没有Postman,只有命令行 → 用curl
- 需要把接口测试集成到Shell脚本 → 用curl
- 快速验证一个接口 → 用curl比打开Postman更快
6.2 curl 基础用法
GET请求
bash
# 最简单的GET请求
curl https://jsonplaceholder.typicode.com/posts/1
# 带查询参数
curl "https://api.example.com/users?page=1&size=20"
# 显示响应头信息
curl -i https://jsonplaceholder.typicode.com/posts/1
# 只显示响应头
curl -I https://jsonplaceholder.typicode.com/posts/1
# 跟随重定向
curl -L https://bit.ly/xxx
# 保存响应到文件
curl -o response.json https://jsonplaceholder.typicode.com/posts/1
POST请求
bash
# POST JSON数据
curl -X POST https://jsonplaceholder.typicode.com/posts -H "Content-Type: application/json" -d '{"title":"foo","body":"bar","userId":1}'
# POST表单数据
curl -X POST https://api.example.com/login -d "username=admin" -d "password=123456"
# POST文件
curl -X POST https://api.example.com/upload -F "file=@/path/to/file.jpg" -F "description=我的图片"
其他HTTP方法
bash
# PUT请求
curl -X PUT https://jsonplaceholder.typicode.com/posts/1 -H "Content-Type: application/json" -d '{"title":"updated","body":"new body"}'
# DELETE请求
curl -X DELETE https://jsonplaceholder.typicode.com/posts/1
# PATCH请求
curl -X PATCH https://jsonplaceholder.typicode.com/posts/1 -H "Content-Type: application/json" -d '{"title":"patched"}'
6.3 curl 常用选项速查表
| 选项 | 全称 | 说明 | 示例 |
|---|---|---|---|
-X |
--request |
指定HTTP方法 | -X POST |
-H |
--header |
添加请求头 | -H "Content-Type: json" |
-d |
--data |
发送数据 | -d '{"key":"val"}' |
-F |
--form |
发送表单数据 | -F "file=@a.jpg" |
-o |
--output |
输出到文件 | -o result.json |
-i |
--include |
包含响应头 | -i |
-I |
--head |
只获取响应头 | -I |
-v |
--verbose |
详细模式 | -v |
-s |
--silent |
静默模式 | -s |
-L |
--location |
跟随重定向 | -L |
-u |
--user |
用户名密码 | -u admin:123456 |
-k |
--insecure |
忽略SSL证书 | -k |
--cookie |
发送Cookie | --cookie "session=abc" |
|
--cookie-jar |
保存Cookie | --cookie-jar cookies.txt |
6.4 认证方式
Basic Auth
bash
curl -u username:password https://api.example.com/protected
# 或
curl -H "Authorization: Basic $(echo -n 'user:pass' | base64)" https://api.example.com/protected
Bearer Token
bash
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." https://api.example.com/users
API Key
bash
# 通过Header传递
curl -H "X-API-Key: your-api-key" https://api.example.com/data
# 通过Query传递
curl "https://api.example.com/data?api_key=your-api-key"
6.5 高级技巧
保存和携带Cookie
bash
# 登录并保存Cookie
curl -X POST https://api.example.com/login -d "username=admin&password=123" --cookie-jar cookies.txt
# 使用保存的Cookie访问
curl https://api.example.com/profile --cookie cookies.txt
上传下载文件
bash
# 下载文件(显示进度条)
curl -O https://example.com/file.zip
# 下载文件(指定文件名)
curl -o myfile.zip https://example.com/file.zip
# 断点续传
curl -C - -o largefile.zip https://example.com/large.zip
# 上传文件
curl -F "file=@/path/to/local/file.jpg" https://api.example.com/upload
使用代理
bash
# HTTP代理
curl -x http://proxy.example.com:8080 https://target.com
# SOCKS5代理
curl -x socks5://127.0.0.1:1080 https://target.com
限制请求时间
bash
# 连接超时5秒,总超时30秒
curl --connect-timeout 5 --max-time 30 https://api.example.com/slow
6.6 curl 实战脚本
自动化测试脚本示例
bash
#!/bin/bash
# 接口测试脚本
BASE_URL="https://jsonplaceholder.typicode.com"
PASS=0
FAIL=0
# 测试1:GET请求
echo "测试1: GET /posts/1"
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" "$BASE_URL/posts/1")
if [ "$RESPONSE" -eq 200 ]; then
echo "✓ 通过"
((PASS++))
else
echo "✗ 失败 (状态码: $RESPONSE)"
((FAIL++))
fi
# 测试2:POST请求
echo "测试2: POST /posts"
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" -X POST "$BASE_URL/posts" -H "Content-Type: application/json" -d '{"title":"test","body":"test","userId":1}')
if [ "$RESPONSE" -eq 201 ]; then
echo "✓ 通过"
((PASS++))
else
echo "✗ 失败 (状态码: $RESPONSE)"
((FAIL++))
fi
# 测试3:验证响应内容
echo "测试3: 验证响应JSON字段"
TITLE=$(curl -s "$BASE_URL/posts/1" | grep -o '"title"[^,]*' | cut -d'"' -f4)
if [ -n "$TITLE" ]; then
echo "✓ 通过 (title: $TITLE)"
((PASS++))
else
echo "✗ 失败"
((FAIL++))
fi
echo ""
echo "========================"
echo "通过: $PASS"
echo "失败: $FAIL"
echo "========================"
结合jq处理JSON
bash
# 安装jq(JSON处理器)
# macOS: brew install jq
# Ubuntu: apt-get install jq
# 格式化JSON输出
curl -s https://jsonplaceholder.typicode.com/posts/1 | jq
# 提取特定字段
curl -s https://jsonplaceholder.typicode.com/posts/1 | jq '.title'
# 提取数组中的字段
curl -s https://jsonplaceholder.typicode.com/posts | jq '.[0:3] | .[].title'
# 复杂查询
curl -s https://jsonplaceholder.typicode.com/posts | jq '[.[] | {id: .id, title: .title}]'
6.7 curl vs Postman 对比
| 场景 | curl | Postman |
|---|---|---|
| 快速调试 | ✓ 命令行直接执行 | 需要打开应用 |
| 复杂断言 | 需要配合jq等工具 | 内置断言功能 |
| 团队协作 | 需要分享脚本 | 直接分享Collection |
| 自动化CI/CD | ✓ 天然支持 | 需要Newman |
| 可视化 | 无 | ✓ 界面友好 |
| 历史记录 | 无 | ✓ 自动保存 |
建议:日常调试用Postman,自动化脚本用curl。
6.8 本章小结
curl核心命令
- GET请求:curl URL、curl -i URL、curl -I URL
- POST请求:curl -X POST -d 'data' URL、curl -F 'file=@path' URL
- 认证:-u user:pass、-H "Bearer token"
- 输出控制:-o file、-s 静默、-v 详细
- 高级:--cookie、-L 重定向、-x 代理
课后练习 📝
- 基础题 :用curl访问
https://jsonplaceholder.typicode.com/posts,只显示前3条数据的title。 - 进阶题:编写一个Shell脚本,测试登录接口(成功/失败场景),并输出测试报告。
- 挑战题:用curl + jq实现一个完整的用户CRUD测试脚本。
6.9 下章预告
下一章我们将学习JMeter,用它来做接口性能和压力测试!
"curl是程序员的瑞士军刀,掌握它,你就能在任何环境下与API对话。"