深入理解 `curl`:开发者必备的数据传输利器
深入理解 curl
:开发者必备的数据传输利器
1. 引言
在日常开发、调试 API、抓取网页、测试网络连接等任务中,curl
是一个极其强大且不可或缺的命令行工具。它支持多种协议、平台广泛、语法灵活,对于后端工程师、测试工程师、运维人员等技术角色来说都是一项基础技能。
2. curl 是什么?
curl
(Client URL)是一个用于在命令行中发起网络请求的工具,支持的协议包括:
- HTTP / HTTPS
- FTP / FTPS
- SCP / SFTP
- LDAP / LDAPS
- SMB / TELNET 等等
它的底层是使用 libcurl
库编写的,这也是许多编程语言(如 PHP、Python)访问网络的底层依赖。
3. 安装 curl
Linux
多数 Linux 发行版默认已安装 curl
。如未安装,可以使用包管理器安装:
# Debian/Ubuntu
sudo apt install curl
# CentOS/RHEL
sudo yum install curl
macOS
macOS 通常也已预装 curl
。如需更新版本:
brew install curl
Windows
- 可通过 https://curl.se/windows/ 下载。
- 或使用 Windows 包管理器(如 winget)安装:
winget install curl
4. 基础用法
发起 GET 请求
curl https://api.example.com/data
发起 POST 请求
curl -X POST -d "key=value&key2=value2" https://api.example.com/form
添加请求头
curl -H "Authorization: Bearer <token>" https://api.example.com/protected
发送 JSON 数据
curl -X POST -H "Content-Type: application/json" \
-d '{"username": "admin", "password": "123456"}' \
https://api.example.com/login
5. 常见使用场景
下载文件
curl -O https://example.com/file.zip
上传文件
curl -F "file=@/path/to/file.txt" https://example.com/upload
跟踪重定向
curl -L https://short.url
查看响应头
curl -I https://example.com
6. 请求类型详解(GET / POST / PUT / DELETE)
GET(默认)
用于请求资源,不应产生副作用:
curl https://api.example.com/users
POST
用于创建资源或提交表单数据:
curl -X POST -d "name=Jack" https://api.example.com/users
PUT
用于更新资源(整个替换):
curl -X PUT -H "Content-Type: application/json" \
-d '{"name": "Jack Updated"}' \
https://api.example.com/users/123
DELETE
用于删除资源:
curl -X DELETE https://api.example.com/users/123
7. 认证与安全
Basic Auth
curl -u username:password https://api.example.com/login
Bearer Token
curl -H "Authorization: Bearer your_token" https://api.example.com
SSL 证书验证关闭(不推荐)
curl -k https://self-signed.badssl.com/
8. 常用参数与技巧
参数 | 说明 |
---|---|
-A |
设置 User-Agent 字符串 |
-b |
发送 Cookie(字符串或从文件读取) |
-d |
发送 POST 请求,附带数据 |
-e |
设置 Referer 头(来源页) |
-F |
发送 multipart/form-data 表单数据(文件上传) |
-H |
自定义报头 |
-I |
发送 HEAD 请求(仅获取响应头,无响应体) |
-k |
SSL 证书验证关闭 |
-L |
自动跟随重定向(3xx 响应) |
-o |
指定输出文件 |
-r |
请求部分内容(字节范围) |
-s |
静默模式(不显示进度条) |
-v |
显示请求与响应详细信息(verbose) |
--retry |
请求失败时自动重试 |
-x |
使用代理 |
-h 或--help |
显示最常用的选项列表 |
-h category |
列出所有现有类别 |
-h http |
列出http可用选项 |
-h all |
列出所有可用选项 |
9. 调试与开发技巧
- 配合
jq
美化 JSON 输出:
curl https://api.example.com/data | jq .
- 记录请求过程:
curl -v https://api.example.com
- 将请求保存为文件:
curl -o response.json https://api.example.com/data
10. curl 与 libcurl:集成到程序中
curl
命令行工具基于 libcurl
。许多语言提供 libcurl
的绑定或包装库:
- Python:
pycurl
- PHP:
curl
扩展 - C/C++: 直接使用
libcurl
- Go/Rust:使用对应第三方封装
例如 C 中使用 libcurl:
CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
11. 总结
curl
是一个功能丰富、平台无关、支持多协议的命令行工具。不论你是调试接口、测试连接,还是集成到程序中,curl
都是开发者日常工具链的重要一环。
推荐进一步阅读:
- 官方文档:https://curl.se/docs/
- man page:
man curl
- Everything curl(超详手册)