软件测试接口测试从入门到精通: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对话。"

相关推荐
潘正翔8 分钟前
docker基础_镜像使用
linux·运维·服务器·docker·容器·centos·devops
24计网1王仔寿32 分钟前
Linux运维与云计算全栈系统化学习指南(Shell+虚拟化+OpenStack+Docker+公私云实战)
linux·课程设计·数据库开发·微信公众平台·neo4j·命令模式·sequoiadb
DB哥讲数据库41 分钟前
rocky linux安装教程:VMware虚拟机图文讲解部署Rocky Linux 9(附镜像包)
linux·运维·服务器
未*望1 小时前
【Linux入坑(二)—全志T133开发板适配USB-电容屏触摸屏驱动(多点触控) 】
linux·运维·服务器
懒鸟一枚1 小时前
为什么 useradd -rs /bin/false service 创建的用户无法用 su 切换?
linux·服务器·数据库
學點1 小时前
Linux ubuntu安装redis
linux·redis·ubuntu
天空'之城2 小时前
Linux 系统编程 10:线程同步
linux·开发语言·系统编程·线程同步
河铃旅鹿2 小时前
在Ubuntu系统上为Android交叉编译OpenSSL
android·linux·ubuntu
长孙豪翔2 小时前
引发事件的问题
java·linux·数据库
小张成长计划..2 小时前
【Linux】7:第一个系统程序-进度条
linux·运维·服务器