前言:为什么测开要学curl和jq?
先问自己几个问题:
- 写完一个接口,你想快速验证它能不能通 → 用curl
- 接口返回了一长串JSON,你想看懂它在说什么 → 用jq
- 你在脚本里要调用接口、取返回值、做断言 → curl + jq 组合
这两个命令,是测开从"手工点按钮"走向"自动化脚本"的必经之路。
一句话定位 :
curl是测开发请求的"手",jq是测开看数据的"眼"。
一、curl:发送网络请求
1.1 curl是什么?能干什么?
curl 是一个发网络请求的命令行工具,支持 HTTP、HTTPS、FTP 等多种协议。
核心特点:非交互式。命令执行完才显示结果,不能像浏览器那样边操作边交互。
测开常用场景:
- 快速验证接口能不能通
- 在脚本里调用API获取数据
- 配合Charles抓包调试
- 写接口冒烟测试脚本
1.2 最基础:发一个GET请求
bash
# 直接输入URL,默认就是GET请求
curl https://www.baidu.com
# 你会看到百度首页的HTML源码打印在屏幕上
新手理解:就像在浏览器地址栏输入网址按回车,只不过结果直接显示在终端里。
如果想显式指定是GET请求(让代码更清晰):
bash
curl -X GET https://www.baidu.com
-X参数用来指定请求方法,-X GET就是发GET请求。
1.3 发POST请求(测开每天都要用)
POST请求通常用于提交数据,比如登录、创建订单。
bash
# 方式1:用 -d 发送数据,curl 自动变成POST请求
curl -d "username=admin&password=123456" https://api.example.com/login
# 方式2:用 -X POST 显式指定(推荐,更清楚)
curl -X POST -d "username=admin&password=123456" https://api.example.com/login
如果接口要求JSON格式(现在大部分接口都是这样):
bash
# 发送JSON数据
curl -X POST \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"123456"}' \
https://api.example.com/login
| 参数 | 含义 |
|---|---|
-H |
添加请求头(Header),比如指定内容类型 |
-d |
指定请求体(Body),也就是你要提交的数据 |
新手常见报错:
- 返回
415错误 → 忘了加-H "Content-Type: application/json" - 返回
400错误 → JSON格式写错了,检查引号和括号是否匹配
1.4 把响应存下来:-o
bash
# 把接口返回保存到文件
curl -o response.json https://api.example.com/user/1
# 然后可以用cat看,或者用jq解析
cat response.json
测开场景:接口返回数据量大时,先保存下来再慢慢分析。
1.5 只看HTTP状态码(脚本里高频使用)
很多时候我们只关心接口返回200还是500,不需要完整内容:
bash
curl -s -o /dev/null -w "%{http_code}" https://www.baidu.com
# 输出:200
| 参数 | 含义 |
|---|---|
-s |
静默模式,不显示进度条 |
-o /dev/null |
响应内容扔到"黑洞"里不显示 |
-w "%{http_code}" |
只输出HTTP状态码 |
测开场景:写脚本检查服务是否正常。
bash
code=$(curl -s -o /dev/null -w "%{http_code}" https://api.example.com/health)
if [ $code -eq 200 ]; then
echo "✅ 服务正常"
else
echo "❌ 服务异常,状态码:$code"
fi
1.6 看详细过程(接口调不通时救命)
bash
# 加 -v 能看到完整的请求和响应过程
curl -v https://www.baidu.com
输出会包含:
markdown
* 正在尝试连接...
* TCP三次握手过程
> 请求头(你发出去的)
< 响应头(服务器返回的)
< 响应体(服务器返回的内容)
测开场景 :接口调不通时,用
-v看到底是请求头不对,还是服务端报了什么错。
1.7 通过代理发请求(配合Charles抓包)
bash
# -x 指定代理服务器,Charles默认端口是8888
curl -x 127.0.0.1:8888 https://www.baidu.com
# 带数据的请求也可以走代理
curl -x 127.0.0.1:8888 -X POST -d "user=1234" https://api.example.com/test
测开场景:用Charles抓包调试时,让curl的请求走代理,就能在Charles里看到完整的请求和响应,方便排查问题。
使用步骤:
- 打开Charles,记下代理端口(默认8888)
- 执行加了
-x的curl命令 - 在Charles中查看捕获到的请求详情
1.8 curl速查表
| 想做什么 | 命令 |
|---|---|
| 发GET请求 | curl http://api.example.com |
| 发POST请求(表单) | curl -X POST -d "key=value" http://api.example.com |
| 发POST请求(JSON) | curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' http://api.example.com |
| 保存响应到文件 | curl -o response.json http://api.example.com |
| 只看HTTP状态码 | curl -s -o /dev/null -w "%{http_code}" http://api.example.com |
| 查看完整请求过程 | curl -v http://api.example.com |
| 通过代理发请求 | curl -x 127.0.0.1:8888 http://api.example.com |
二、jq:解析JSON数据
2.1 jq是什么?
jq 是一个专门处理JSON数据的命令行工具。不是jQuery,是完全独立的工具。
核心概念:jq是一个"过滤器"------接收JSON输入 → 处理 → 产生输出。
测开常用场景:
- 把乱糟糟的JSON格式化成好看的样子
- 从接口返回中提取某个字段的值
- 在脚本里提取token、提取ID做后续处理
bash
# 安装(Ubuntu/Debian)
sudo apt-get install jq
# 安装(Mac)
brew install jq
# 验证是否安装成功
jq --version
2.2 美化JSON(新手第一个要学的)
接口返回的JSON经常是一长条没有换行的字符串,根本看不清楚:
bash
# 原始返回(一团乱)
echo '{"name":"霍格沃兹","students":100,"courses":["测试开发","性能测试"]}'
用 jq '.' 一键格式化:
bash
echo '{"name":"霍格沃兹","students":100,"courses":["测试开发","性能测试"]}' | jq '.'
输出变成(有缩进、有颜色):
json
{
"name": "霍格沃兹",
"students": 100,
"courses": [
"测试开发",
"性能测试"
]
}
.是最简单的jq程序:把输入原样输出,但做了格式化和高亮。
2.3 提取字段(测开最常用!)
bash
# 数据准备
data='{"name":"霍格沃兹","students":100,"city":"北京"}'
# 提取name字段
echo $data | jq '.name'
# 输出:"霍格沃兹"
# 提取students字段
echo $data | jq '.students'
# 输出:100
# 去掉引号,输出纯文本(适合存变量)
echo $data | jq -r '.name'
# 输出:霍格沃兹(没有引号)
| 参数 | 含义 |
|---|---|
jq '.字段名' |
提取字段(输出带引号的字符串) |
jq -r '.字段名' |
提取字段(输出纯文本,无引号) |
新手理解 :.name 的意思就是"从JSON里把name的值取出来"。
2.4 提取数组元素
bash
# 数据准备:一个用户列表
data='[
{"name":"张三","age":25},
{"name":"李四","age":30},
{"name":"王五","age":28}
]'
# 提取第一个元素(下标从0开始)
echo $data | jq '.[0]'
# 输出:{"name":"张三","age":25}
# 提取第一个和第二个
echo $data | jq '.[0,1]'
# 输出两个对象
# 提取最后一个(负数从末尾开始数)
echo $data | jq '.[-1]'
# 输出:{"name":"王五","age":28}
# 提取所有元素
echo $data | jq '.[]'
# 输出三个对象
# 提取所有人的名字
echo $data | jq '.[].name'
# 输出:"张三" "李四" "王五"
# 提取所有人的名字(纯文本,每行一个)
echo $data | jq -r '.[].name'
# 输出:
# 张三
# 李四
# 王五
2.5 提取嵌套字段
bash
# 数据准备:嵌套结构
data='{
"code": 200,
"data": {
"user": {
"id": 123,
"name": "测试用户",
"profile": {
"age": 25,
"city": "北京"
}
}
}
}'
# 逐层提取,用 . 连接
echo $data | jq '.data.user.name'
# 输出:"测试用户"
echo $data | jq '.data.user.profile.city'
# 输出:"北京"
# 提取后去引号
echo $data | jq -r '.data.user.profile.city'
# 输出:北京
新手理解 :一层一层往下点,就像在编程里写 data.user.name 一样。
2.6 数据重组(把数据变成你想要的形状)
bash
data='{"name":"霍格沃兹","students":100,"city":"北京"}'
# 重组成新对象:只取需要的字段,还可以重命名
echo $data | jq '{"学校名称":.name, "人数":.students}'
# 输出:{"学校名称":"霍格沃兹","人数":100}
# 重组成新数组
echo $data | jq '[.name,.city]'
# 输出:["霍格沃兹","北京"]
注意 :重组时,新的key不加点号,但提取的旧值要加点号。
{"新名字":.旧名字}
2.7 常用jq操作速查
| 想做什么 | 命令 |
|---|---|
| 美化JSON | jq '.' |
| 提取字段 | jq '.字段名' |
| 提取字段(纯文本) | jq -r '.字段名' |
| 取数组第一个 | jq '.[0]' |
| 取数组最后一个 | jq '.[-1]' |
| 取数组所有元素 | jq '.[]' |
| 取嵌套字段 | jq '.父级.子级.字段' |
| 重组为对象 | jq '{"新key":.旧key}' |
| 重组为数组 | jq '[.字段1,.字段2]' |
| 获取数组长度 | jq 'length' |
三、curl + jq = 测开黄金组合
单独用curl只能拿数据,单独用jq只能解析已有数据,合在一起就是自动化脚本的基石。
实战1:登录 + 提取token
bash
#!/bin/bash
# 调用登录接口,提取token
# 1. 发登录请求,拿到返回结果
login_response=$(curl -s -X POST \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"123456"}' \
https://api.example.com/login)
# 2. 用jq提取token
token=$(echo $login_response | jq -r '.data.token')
# 3. 判断是否提取成功
if [ "$token" = "null" ] || [ -z "$token" ]; then
echo "❌ 登录失败"
echo "返回信息:$(echo $login_response | jq '.msg')"
exit 1
fi
echo "✅ 登录成功,Token: ${token:0:20}..."
实战2:提取列表中所有ID
bash
#!/bin/bash
# 获取所有用户的ID
# 调用接口获取用户列表
response=$(curl -s https://api.example.com/users)
# 提取所有用户的ID(纯文本输出)
user_ids=$(echo $response | jq -r '.data[].id')
# 逐个处理
for id in $user_ids; do
echo "处理用户ID: $id"
# 这里可以继续调用其他接口
done
实战3:检查接口返回码 + 提取数据
bash
#!/bin/bash
# 完整的接口测试流程
# 1. 调用接口
response=$(curl -s -X GET https://api.example.com/order/1001)
# 2. 提取返回码
code=$(echo $response | jq -r '.code')
# 3. 根据返回码做不同处理
if [ "$code" = "200" ]; then
echo "✅ 请求成功"
# 提取订单金额
amount=$(echo $response | jq -r '.data.amount')
echo "订单金额:$amount"
else
echo "❌ 请求失败"
echo "错误信息:$(echo $response | jq -r '.msg')"
fi
四、新手避坑指南
curl常见问题
| 问题现象 | 原因 | 解决办法 |
|---|---|---|
curl: command not found |
系统没装curl | apt-get install curl |
| 返回415错误 | 没加Content-Type头 | 加上 -H "Content-Type: application/json" |
| 返回400错误 | JSON格式不对 | 检查引号、花括号是否匹配 |
| POST数据服务端收不到 | 用了单引号里有变量 | 用双引号包起来,如 -d "{\"key\":\"$value\"}" |
| Windows下报错 | 引号被转义 | 使用Git Bash或WSL |
jq常见问题
| 问题现象 | 原因 | 解决办法 |
|---|---|---|
jq: command not found |
没装jq | apt-get install jq 或 brew install jq |
提取返回 null |
字段路径写错了 | 先用 jq '.' 看完整结构 |
| 提取字符串带引号 | 默认输出JSON格式 | 加 -r 参数 |
解析报错 parse error |
JSON格式不合法 | 检查是否有BOM头或多余字符 |
调试通用技巧
bash
# 1. 先不加 jq,看原始返回
curl -s https://api.example.com/user/1
# 2. 确认返回是合法JSON后,再加 jq
curl -s https://api.example.com/user/1 | jq '.'
# 3. 逐层提取,不要一步到位
curl -s https://api.example.com/user/1 | jq '.data'
curl -s https://api.example.com/user/1 | jq '.data.user'
curl -s https://api.example.com/user/1 | jq '.data.user.name'
五、总结
| 命令 | 一句话是什么 | 测开什么时候用 |
|---|---|---|
curl |
发HTTP请求的命令行工具 | 测接口、调API、配合Charles抓包 |
jq |
解析JSON的命令行工具 | 看懂接口返回、提取token/ID、脚本里处理数据 |
给新手的三个建议:
- 从组合命令开始练 :
curl ... | jq '.'是最常用的组合,先把这个用熟 - 遇到不懂的接口先curl看返回:不要上来就写代码,先用命令行验证
- 写脚本时多用
-r去引号:提取的值要存变量,带引号会出问题
记住 :
curl和jq是测开最常用的两个命令,几乎每天都会用到。花半天时间把本文的例子都敲一遍,以后写接口自动化脚本会顺畅很多。