476 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: curl 命令完全指南
date: 2026-03-27 10:10:35
tags:
- curl
- Linux
- Windows
- API测试
---
## 简介
curl (Client for URLs) 是一个强大的命令行工具用于传输数据。它支持多种协议HTTP、HTTPS、FTP等是开发者和运维人员必备的工具之一。
## 安装
### Linux
大多数 Linux 发行版已预装 curl
```bash
# Debian/Ubuntu
sudo apt install curl
# CentOS/RHEL
sudo yum install curl
# Arch Linux
sudo pacman -S curl
# 验证安装
curl --version
```
### Windows
**方式一Windows 10/11 自带**
Windows 10 1803+ 和 Windows 11 已内置 curl。
**方式二:手动安装**
1. 访问 https://curl.se/windows/ 下载
2. 解压到 `C:\tools\curl`
3. 添加到系统 PATH 环境变量
**方式三:使用包管理器**
```powershell
# winget
winget install curl
# Chocolatey
choco install curl
# Scoop
scoop install curl
```
## 基础用法
### GET 请求
```bash
# 基本 GET 请求
curl https://api.example.com/users
# 带查询参数
curl "https://api.example.com/users?page=1&limit=10"
# 只显示响应头
curl -I https://api.example.com
# 显示响应头和响应体
curl -i https://api.example.com
# 跟随重定向
curl -L https://example.com/redirect
```
### POST 请求
```bash
# 发送 JSON 数据(请求体)
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name": "张三", "email": "zhangsan@example.com"}'
# 发送表单数据
curl -X POST https://api.example.com/login \
-d "username=admin&password=123456"
# 发送文件
curl -X POST https://api.example.com/upload \
-F "file=@/path/to/file.jpg"
# 发送多部分表单(文件+字段)
curl -X POST https://api.example.com/upload \
-F "file=@/path/to/file.jpg" \
-F "name=张三" \
-F "description=用户头像"
```
### PUT / PATCH / DELETE 请求
```bash
# PUT 请求(完整更新)
curl -X PUT https://api.example.com/users/1 \
-H "Content-Type: application/json" \
-d '{"name": "李四", "email": "lisi@example.com"}'
# PATCH 请求(部分更新)
curl -X PATCH https://api.example.com/users/1 \
-H "Content-Type: application/json" \
-d '{"name": "李四"}'
# DELETE 请求
curl -X DELETE https://api.example.com/users/1
```
## 常用选项详解
| 选项 | 说明 | 示例 |
|------|------|------|
| `-X` | 指定请求方法 | `-X POST` |
| `-H` | 添加请求头 | `-H "Authorization: Bearer token"` |
| `-d` | 发送数据 | `-d '{"key":"value"}'` |
| `-F` | 上传文件/表单 | `-F "file=@photo.jpg"` |
| `-u` | 基础认证 | `-u user:pass` |
| `-I` | 只获取响应头 | `curl -I url` |
| `-i` | 显示响应头和内容 | `curl -i url` |
| `-L` | 跟随重定向 | `curl -L url` |
| `-o` | 保存到文件 | `-o output.json` |
| `-O` | 使用远程文件名保存 | `-O` |
| `-s` | 静默模式 | `-s` |
| `-v` | 显示详细信息 | `-v` |
| `-k` | 忽略 SSL 证书验证 | `-k` |
| `-x` | 使用代理 | `-x http://proxy:8080` |
| `--connect-timeout` | 连接超时(秒) | `--connect-timeout 10` |
| `-m` | 最大请求时间(秒) | `-m 30` |
## 替代 Postman 的完整方案
### 1. 认证请求
```bash
# Bearer Token 认证
curl -H "Authorization: Bearer your_token_here" \
https://api.example.com/data
# Basic Auth 认证
curl -u "username:password" \
https://api.example.com/data
# API Key 认证Header 方式)
curl -H "X-API-Key: your_api_key" \
https://api.example.com/data
# API Key 认证Query 参数方式)
curl "https://api.example.com/data?api_key=your_api_key"
```
### 2. 处理 Cookie
```bash
# 保存 Cookie 到文件
curl -c cookies.txt https://api.example.com/login \
-d "username=admin&password=123456"
# 使用已保存的 Cookie
curl -b cookies.txt https://api.example.com/profile
# 同时读写 Cookie
curl -b cookies.txt -c cookies.txt https://api.example.com/action
# 直接设置 Cookie
curl -H "Cookie: session=abc123; token=xyz789" \
https://api.example.com/data
```
### 3. 美化 JSON 输出
```bash
# 使用 jq 美化Linux/macOS
curl -s https://api.example.com/users | jq
# 使用 Python 美化(跨平台)
curl -s https://api.example.com/users | python -m json.tool
# Windows PowerShell 方式
curl -s https://api.example.com/users | ConvertFrom-Json | ConvertTo-Json -Depth 10
```
### 4. 保存请求集合
创建一个 `api-requests.sh` 文件:
```bash
#!/bin/bash
# API 请求集合 - 类似 Postman Collection
BASE_URL="https://api.example.com"
TOKEN="your_token_here"
# 获取用户列表
get_users() {
curl -s "$BASE_URL/users" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json"
}
# 创建用户
create_user() {
curl -s -X POST "$BASE_URL/users" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "张三", "email": "zhangsan@example.com"}'
}
# 获取单个用户
get_user() {
local id=$1
curl -s "$BASE_URL/users/$id" \
-H "Authorization: Bearer $TOKEN"
}
# 调用示例
case "$1" in
users) get_users | jq ;;
create) create_user | jq ;;
user) get_user "$2" | jq ;;
*) echo "用法: $0 {users|create|user <id>}" ;;
esac
```
使用方式:
```bash
chmod +x api-requests.sh
./api-requests.sh users
./api-requests.sh create
./api-requests.sh user 1
```
### 5. 环境变量配置
```bash
# 创建 .env 文件(添加到 .gitignore
# .env
API_BASE_URL=https://api.example.com
API_TOKEN=your_token_here
# 在脚本中使用
source .env
curl -H "Authorization: Bearer $API_TOKEN" \
"$API_BASE_URL/users"
```
### 6. 环境切换
创建多环境配置:
```bash
# environments.sh
get_env() {
case "$1" in
dev)
BASE_URL="https://dev-api.example.com"
TOKEN="$DEV_TOKEN"
;;
staging)
BASE_URL="https://staging-api.example.com"
TOKEN="$STAGING_TOKEN"
;;
prod)
BASE_URL="https://api.example.com"
TOKEN="$PROD_TOKEN"
;;
*)
echo "未知环境: $1"
exit 1
;;
esac
}
# 使用
source environments.sh
get_env dev
curl -H "Authorization: Bearer $TOKEN" "$BASE_URL/users"
```
### 7. 测试脚本示例
```bash
#!/bin/bash
# API 测试脚本
BASE_URL="https://api.example.com"
TOKEN="test_token"
echo "=== 测试用户 API ==="
# 测试获取用户
echo "1. GET /users"
response=$(curl -s -w "\n%{http_code}" "$BASE_URL/users" \
-H "Authorization: Bearer $TOKEN")
http_code=$(echo "$response" | tail -n1)
body=$(echo "$response" | head -n -1)
if [ "$http_code" -eq 200 ]; then
echo "✅ 成功 (HTTP $http_code)"
echo "$body" | jq
else
echo "❌ 失败 (HTTP $http_code)"
echo "$body"
fi
# 测试创建用户
echo -e "\n2. POST /users"
response=$(curl -s -w "\n%{http_code}" -X POST "$BASE_URL/users" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "测试用户"}')
http_code=$(echo "$response" | tail -n1)
body=$(echo "$response" | head -n -1)
if [ "$http_code" -eq 201 ]; then
echo "✅ 成功 (HTTP $http_code)"
else
echo "❌ 失败 (HTTP $http_code)"
fi
```
## Windows 特殊处理
### PowerShell 中的引号问题
PowerShell 对单引号和双引号有特殊处理,推荐以下方式:
```powershell
# 方式一:使用双引号,内部双引号用反引号转义
curl -X POST https://api.example.com/users `
-H "Content-Type: application/json" `
-d "{`"name`": `"张三`"}"
# 方式二:使用单引号包裹 JSON推荐
curl -X POST https://api.example.com/users `
-H "Content-Type: application/json" `
-d '{"name": "张三"}'
# 方式三:从文件读取数据
curl -X POST https://api.example.com/users `
-H "Content-Type: application/json" `
-d "@request.json"
```
### Windows CMD 中的处理
```cmd
# 使用双引号,内部双引号用反斜杠转义
curl -X POST https://api.example.com/users ^
-H "Content-Type: application/json" ^
-d "{\"name\": \"张三\"}"
# 或使用文件
curl -X POST https://api.example.com/users ^
-H "Content-Type: application/json" ^
-d "@request.json"
```
### 创建 request.json 文件
对于复杂的请求体,推荐使用文件:
```json
{
"name": "张三",
"email": "zhangsan@example.com",
"roles": ["admin", "user"],
"settings": {
"theme": "dark",
"language": "zh-CN"
}
}
```
```bash
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d @request.json
```
## 实用技巧
### 1. 测量请求时间
```bash
curl -w "DNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" \
-o /dev/null -s https://api.example.com
```
### 2. 下载文件并显示进度
```bash
curl -O --progress-bar https://example.com/large-file.zip
```
### 3. 断点续传
```bash
curl -C - -O https://example.com/large-file.zip
```
### 4. 限速下载
```bash
# 限制为 1MB/s
curl --limit-rate 1M -O https://example.com/file.zip
```
### 5. 批量下载
```bash
# 下载多个文件
curl -O https://example.com/file1.zip -O https://example.com/file2.zip
# 使用序列
curl -O https://example.com/file[1-10].jpg
# 使用字母序列
curl -O https://example.com/file[a-z].jpg
```
### 6. 调试请求
```bash
# 显示完整请求/响应信息
curl -v https://api.example.com
# 输出详细信息到文件
curl --trace-ascii debug.txt https://api.example.com
```
## curl vs Postman 对比
| 功能 | curl | Postman |
|------|------|---------|
| 安装 | 系统内置/轻量 | 需下载安装 |
| 脚本化 | ✅ 原生支持 | ❌ 需导出 |
| 自动化 | ✅ 易于集成 CI/CD | 需 Newman |
| 资源占用 | 极低 | 较高 |
| 可视化 | ❌ 无 | ✅ 有 |
| 学习曲线 | 较陡 | 平缓 |
| 环境管理 | 手动配置 | 图形界面 |
| 团队协作 | Git + 脚本 | 云同步 |
| 价格 | 免费 | 免费版有限制 |
## 快速参考
```bash
# 最常用的命令模板
curl -X [METHOD] [URL] \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '[JSON_DATA]' | jq
# 常用组合
curl -s -X POST $URL -H $HEADERS -d $DATA | jq # 静默 POST美化输出
curl -I $URL # 检查响应头
curl -L -I $URL # 跟随重定向并显示头
curl -v $URL # 调试模式
curl -u user:pass $URL # Basic Auth
```
## 总结
curl 是一个功能强大的 HTTP 客户端工具,通过脚本化和命令行参数可以完全替代 Postman 进行 API 测试。虽然缺少可视化界面,但其轻量、可自动化、易于集成的特点使其成为开发者和 DevOps 的首选工具。
掌握 curl 能让你在没有图形界面的服务器环境中也能灵活地进行 API 调试和测试,是每个开发者必备的技能。