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

相关推荐
毒爪的小新9 小时前
Linux 环境极速部署 vLLM:从零搭建生产级大模型推理服务
linux·人工智能·ai·语言模型·vllm
鹤落晴春9 小时前
RH124问答3:从命令行管理文件
linux·运维·服务器
凡人叶枫9 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
Net_Walke10 小时前
【Linux系统】静态链接库与动态链接库
linux·嵌入式硬件
syc789012310 小时前
中文语境下AI编码工具实战对比:从迭代体验看日常开发选择
linux·人工智能·ubuntu
凡人叶枫11 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
vsropy13 小时前
Ubuntu网络图标消失问题/有网络问号
linux·运维·ubuntu
coderwu13 小时前
Ubuntu 24.04 终端输入 openclaw config 提示未找到命令解决办法
linux·运维·ubuntu
凡人叶枫15 小时前
Effective C++ 条款28:避免使用 handles 指向对象内部
linux·服务器·开发语言·c++·嵌入式开发