用于发起 HTTP 请求和传输数据的命令行工具。
基本请求
GET 请求
# 简单 GET 请求
curl https://api.example.com# 保存到文件
curl https://example.com -o output.html
curl https://example.com/file.zip -O # 使用远程文件名
# 跟随重定向
curl -L https://example.com
# 显示响应头
curl -i https://example.com
# 仅显示头部
curl -I https://example.com
# 详细输出(调试)
curl -v https://example.com
POST 请求
# POST 发送数据
curl -X POST https://api.example.com/users \
-d "name=John&email=john@example.com"# POST JSON 数据
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name":"John","email":"john@example.com"}'
# 从文件 POST
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d @data.json
# 表单上传
curl -X POST https://api.example.com/upload \
-F "file=@document.pdf" \
-F "description=My document"
其他 HTTP 方法
# PUT 请求
curl -X PUT https://api.example.com/users/1 \
-H "Content-Type: application/json" \
-d '{"name":"Jane"}'# DELETE 请求
curl -X DELETE https://api.example.com/users/1
# PATCH 请求
curl -X PATCH https://api.example.com/users/1 \
-H "Content-Type: application/json" \
-d '{"email":"newemail@example.com"}'
请求头与认证
自定义请求头
# 添加自定义头
curl -H "User-Agent: MyApp/1.0" https://example.com# 多个请求头
curl -H "Accept: application/json" \
-H "Authorization: Bearer token123" \
https://api.example.com
认证
# 基本认证
curl -u username:password https://api.example.com# Bearer token
curl -H "Authorization: Bearer YOUR_TOKEN" \
https://api.example.com
# API key 在请求头中
curl -H "X-API-Key: your_api_key" \
https://api.example.com
# API key 在 URL 中
curl "https://api.example.com?api_key=your_key"
高级功能
超时与重试
# 连接超时(秒)
curl --connect-timeout 10 https://example.com# 整个操作最大时间
curl --max-time 30 https://example.com
# 失败时重试
curl --retry 3 https://example.com
# 重试延迟
curl --retry 3 --retry-delay 5 https://example.com
Cookie
# 发送 Cookie
curl -b "session=abc123" https://example.com# 保存 Cookie 到文件
curl -c cookies.txt https://example.com
# 从文件加载 Cookie
curl -b cookies.txt https://example.com
# 同时保存和加载
curl -b cookies.txt -c cookies.txt https://example.com
代理
# 使用 HTTP 代理
curl -x http://proxy.example.com:8080 https://api.example.com# 带代理认证
curl -x http://proxy:8080 -U user:pass https://api.example.com
# SOCKS 代理
curl --socks5 127.0.0.1:1080 https://api.example.com
SSL/TLS
# 忽略 SSL 证书错误(生产环境不推荐)
curl -k https://self-signed.example.com# 使用特定 SSL 版本
curl --tlsv1.2 https://example.com
# 使用客户端证书
curl --cert client.crt --key client.key https://example.com
# 显示 SSL 握手详情
curl -v https://example.com 2>&1 | grep -i ssl
响应处理
输出格式化
# 静默模式(无进度条)
curl -s https://api.example.com# 仅显示 HTTP 状态码
curl -s -o /dev/null -w "%{http_code}" https://example.com
# 自定义输出格式
curl -w "\nTime: %{time_total}s\nStatus: %{http_code}\n" \
https://example.com
# 格式化 JSON(用 jq)
curl -s https://api.example.com | jq '.'
范围请求
# 下载特定字节范围
curl -r 0-1000 https://example.com/large-file.zip# 断点续传
curl -C - -O https://example.com/large-file.zip
文件操作
下载文件
# 下载文件
curl -O https://example.com/file.zip# 自定义名称下载
curl -o myfile.zip https://example.com/file.zip
# 下载多个文件
curl -O https://example.com/file1.zip \
-O https://example.com/file2.zip
# 断点续传下载
curl -C - -O https://example.com/large-file.zip
上传文件
# FTP 上传
curl -T file.txt ftp://ftp.example.com/upload/# HTTP PUT 上传
curl -T file.txt https://example.com/upload
# 表单文件上传
curl -F "file=@document.pdf" https://example.com/upload
测试与调试
API 测试
# 测试 REST API
curl -X GET https://api.example.com/users
curl -X GET https://api.example.com/users/1
curl -X POST https://api.example.com/users -d @user.json
curl -X PUT https://api.example.com/users/1 -d @updated.json
curl -X DELETE https://api.example.com/users/1# 详细输出测试
curl -v -X POST https://api.example.com/login \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"pass"}'
性能测试
# 测量请求时间
curl -w "Total time: %{time_total}s\n" https://example.com# 详细时间
curl -w "\nDNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTLS: %{time_appconnect}s\nTransfer: %{time_starttransfer}s\nTotal: %{time_total}s\n" \
-o /dev/null -s https://example.com
常见调试
# 显示请求和响应头
curl -v https://api.example.com# 跟踪请求
curl --trace-ascii trace.txt https://api.example.com
# 输出中包含响应头
curl -i https://api.example.com
常用模式
快速 JSON API 测试:
curl -s https://api.github.com/users/octocat | jq '{name, bio, followers}'
带进度条下载:
curl -# -O https://example.com/large-file.zip
POST JSON 并提取字段:
curl -s -X POST https://api.example.com/login \
-H "Content-Type: application/json" \
-d '{"user":"test","pass":"secret"}' | jq -r '.token'
检查 URL 是否可访问:
if curl -s --head --fail https://example.com > /dev/null; then
echo "Site is up"
else
echo "Site is down"
fi
并行下载:
for i in {1..10}; do
curl -O https://example.com/file$i.jpg &
done
wait
常用参数
-X: HTTP 方法(GET、POST、PUT、DELETE 等)
-d: 发送的数据(POST/PUT)
-H: 自定义请求头
-o: 输出文件
-O: 使用远程文件名保存
-L: 跟随重定向
-i: 输出中包含头部
-I: 仅头部
-v: 详细输出
-s: 静默模式
-S: 静默模式下仍显示错误
-f: HTTP 错误时静默失败
-k: 不安全(忽略 SSL)
-u: 基本认证
-F: 多部分表单数据
-b: 发送 Cookie
-c: 保存 Cookie
-w: 自定义输出格式
技巧
- 脚本中使用
-s 抑制进度条
- 组合
-sS 实现静默但显示错误
- 使用
-L 处理重定向(如短链接)
- 添加
-v 用于调试
- 使用
jq 处理 JSON 响应
- 将常用请求保存为 shell 别名或脚本
- 复杂可复用请求使用
--config
文档
官方文档:https://curl.se/docs/
手册:man curl
HTTP 方法:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
Command-line tool for making HTTP requests and transferring data.
Basic Requests
GET requests
# Simple GET request
curl https://api.example.com# Save output to file
curl https://example.com -o output.html
curl https://example.com/file.zip -O # Use remote filename
# Follow redirects
curl -L https://example.com
# Show response headers
curl -i https://example.com
# Show only headers
curl -I https://example.com
# Verbose output (debugging)
curl -v https://example.com
POST requests
# POST with data
curl -X POST https://api.example.com/users \
-d "name=John&email=john@example.com"# POST JSON data
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name":"John","email":"john@example.com"}'
# POST from file
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d @data.json
# Form upload
curl -X POST https://api.example.com/upload \
-F "file=@document.pdf" \
-F "description=My document"
Other HTTP methods
# PUT request
curl -X PUT https://api.example.com/users/1 \
-H "Content-Type: application/json" \
-d '{"name":"Jane"}'# DELETE request
curl -X DELETE https://api.example.com/users/1
# PATCH request
curl -X PATCH https://api.example.com/users/1 \
-H "Content-Type: application/json" \
-d '{"email":"newemail@example.com"}'
Headers & Authentication
Custom headers
# Add custom header
curl -H "User-Agent: MyApp/1.0" https://example.com# Multiple headers
curl -H "Accept: application/json" \
-H "Authorization: Bearer token123" \
https://api.example.com
Authentication
# Basic auth
curl -u username:password https://api.example.com# Bearer token
curl -H "Authorization: Bearer YOUR_TOKEN" \
https://api.example.com
# API key in header
curl -H "X-API-Key: your_api_key" \
https://api.example.com
# API key in URL
curl "https://api.example.com?api_key=your_key"
Advanced Features
Timeouts & retries
# Connection timeout (seconds)
curl --connect-timeout 10 https://example.com# Max time for entire operation
curl --max-time 30 https://example.com
# Retry on failure
curl --retry 3 https://example.com
# Retry delay
curl --retry 3 --retry-delay 5 https://example.com
Cookies
# Send cookies
curl -b "session=abc123" https://example.com# Save cookies to file
curl -c cookies.txt https://example.com
# Load cookies from file
curl -b cookies.txt https://example.com
# Both save and load
curl -b cookies.txt -c cookies.txt https://example.com
Proxy
# Use HTTP proxy
curl -x http://proxy.example.com:8080 https://api.example.com# With proxy authentication
curl -x http://proxy:8080 -U user:pass https://api.example.com
# SOCKS proxy
curl --socks5 127.0.0.1:1080 https://api.example.com
SSL/TLS
# Ignore SSL certificate errors (not recommended for production)
curl -k https://self-signed.example.com# Use specific SSL version
curl --tlsv1.2 https://example.com
# Use client certificate
curl --cert client.crt --key client.key https://example.com
# Show SSL handshake details
curl -v https://example.com 2>&1 | grep -i ssl
Response Handling
Output formatting
# Silent mode (no progress bar)
curl -s https://api.example.com# Show only HTTP status code
curl -s -o /dev/null -w "%{http_code}" https://example.com
# Custom output format
curl -w "\nTime: %{time_total}s\nStatus: %{http_code}\n" \
https://example.com
# Pretty print JSON (with jq)
curl -s https://api.example.com | jq '.'
Range requests
# Download specific byte range
curl -r 0-1000 https://example.com/large-file.zip# Resume download
curl -C - -O https://example.com/large-file.zip
File Operations
Downloading files
# Download file
curl -O https://example.com/file.zip# Download with custom name
curl -o myfile.zip https://example.com/file.zip
# Download multiple files
curl -O https://example.com/file1.zip \
-O https://example.com/file2.zip
# Resume interrupted download
curl -C - -O https://example.com/large-file.zip
Uploading files
# FTP upload
curl -T file.txt ftp://ftp.example.com/upload/# HTTP PUT upload
curl -T file.txt https://example.com/upload
# Form file upload
curl -F "file=@document.pdf" https://example.com/upload
Testing & Debugging
API testing
# Test REST API
curl -X GET https://api.example.com/users
curl -X GET https://api.example.com/users/1
curl -X POST https://api.example.com/users -d @user.json
curl -X PUT https://api.example.com/users/1 -d @updated.json
curl -X DELETE https://api.example.com/users/1# Test with verbose output
curl -v -X POST https://api.example.com/login \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"pass"}'
Performance testing
# Measure request time
curl -w "Total time: %{time_total}s\n" https://example.com# Detailed timing
curl -w "\nDNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTLS: %{time_appconnect}s\nTransfer: %{time_starttransfer}s\nTotal: %{time_total}s\n" \
-o /dev/null -s https://example.com
Common debugging
# Show request and response headers
curl -v https://api.example.com# Trace request
curl --trace-ascii trace.txt https://api.example.com
# Include response headers in output
curl -i https://api.example.com
Common Patterns
Quick JSON API test:
curl -s https://api.github.com/users/octocat | jq '{name, bio, followers}'
Download with progress bar:
curl -# -O https://example.com/large-file.zip
POST JSON and extract field:
curl -s -X POST https://api.example.com/login \
-H "Content-Type: application/json" \
-d '{"user":"test","pass":"secret"}' | jq -r '.token'
Check if URL is accessible:
if curl -s --head --fail https://example.com > /dev/null; then
echo "Site is up"
else
echo "Site is down"
fi
Parallel downloads:
for i in {1..10}; do
curl -O https://example.com/file$i.jpg &
done
wait
Useful Flags
-X: HTTP method (GET, POST, PUT, DELETE, etc.)
-d: Data to send (POST/PUT)
-H: Custom header
-o: Output file
-O: Save with remote filename
-L: Follow redirects
-i: Include headers in output
-I: Headers only
-v: Verbose output
-s: Silent mode
-S: Show errors even in silent mode
-f: Fail silently on HTTP errors
-k: Insecure (ignore SSL)
-u: Basic authentication
-F: Multipart form data
-b: Send cookies
-c: Save cookies
-w: Custom output format
Tips
- Use
-s in scripts to suppress progress bar
- Combine
-sS for silent but show errors
- Use
-L for redirects (e.g., shortened URLs)
- Add
-v for debugging
- Use
jq to process JSON responses
- Save common requests as shell aliases or scripts
- Use
--config for complex reusable requests
Documentation
Official docs: https://curl.se/docs/
Manual: man curl
HTTP methods: https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods