软件测试接口测试从入门到精通:curl命令行工具

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 代理

课后练习 📝

  1. 基础题 :用curl访问 https://jsonplaceholder.typicode.com/posts,只显示前3条数据的title。
  2. 进阶题:编写一个Shell脚本,测试登录接口(成功/失败场景),并输出测试报告。
  3. 挑战题:用curl + jq实现一个完整的用户CRUD测试脚本。

6.9 下章预告

下一章我们将学习JMeter,用它来做接口性能和压力测试!


"curl是程序员的瑞士军刀,掌握它,你就能在任何环境下与API对话。"

相关推荐
FoldWinCard3 小时前
D5 Linux 网络及端口命令
linux·运维·服务器
零涂毕业设计4 小时前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
tedcloud1235 小时前
OmniRoute怎么部署?开源AI模型路由平台Linux部署教程
linux·服务器·人工智能·开源·音视频
霸道流氓气质5 小时前
KMS 密钥管理服务(Key Management Service)原理与实践
linux·服务器·数据库
SakitamaX5 小时前
LVS(Linux Virtual Server)概念详解
linux·运维·lvs
小张同学a.5 小时前
Linux系统管理
linux·运维
阿龙的工作记录6 小时前
深入理解Linux设备驱动模型
linux·嵌入式硬件·工作记录
代码村新手6 小时前
Linux的基本指令
linux·运维·服务器
hkj88086 小时前
Ubuntu 切换java版本
java·linux·ubuntu
撩得Android一次心动8 小时前
Linux编程笔记3【个人用】
linux·笔记