Linux进阶命令:测开必学的curl和jq

前言:为什么测开要学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里看到完整的请求和响应,方便排查问题。

使用步骤

  1. 打开Charles,记下代理端口(默认8888)
  2. 执行加了 -x 的curl命令
  3. 在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 jqbrew 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、脚本里处理数据

给新手的三个建议:

  1. 从组合命令开始练curl ... | jq '.' 是最常用的组合,先把这个用熟
  2. 遇到不懂的接口先curl看返回:不要上来就写代码,先用命令行验证
  3. 写脚本时多用 -r 去引号:提取的值要存变量,带引号会出问题

记住curljq 是测开最常用的两个命令,几乎每天都会用到。花半天时间把本文的例子都敲一遍,以后写接口自动化脚本会顺畅很多。

相关推荐
minglie12 小时前
zynq的linux驱动版终端AtShellDrv
linux
欧神附体1235 小时前
在虚拟机搭建本地仓库和网络仓库
linux·运维·服务器
是个西兰花5 小时前
Linux:深入解析Linux线程原理与实现
linux·运维·c++·线程·互斥锁
运维大师6 小时前
【Linux运维极简教程】07-磁盘管理与LVM
linux·运维·服务器
乖巧的妹子6 小时前
刷题总结知识
linux·服务器·windows
拳里剑气7 小时前
Linux:基础IO
linux·运维·服务器·io
小小龙学IT7 小时前
Day 2-3:Linux 文件与目录操作
linux
三8447 小时前
基本Linux命令总结
linux·运维·服务器
hehelm8 小时前
AI 大模型接入 SDK —项目概述
linux·服务器·网络·数据库·c++