curl 是命令行传输数据的经典工具,支持 HTTP/HTTPS/FTP 等 30+ 协议。历经 25 年发展,GitHub 斩获 41.6k Stars,已成为全球最流行的网络请求工具。内置 libcurl 库被无数项目集成,Linux/macOS/Windows 全平台支持。

🎤 引言

写代码的人,谁没用过 curl 呢?这货从 1998 年诞生到现在,快 30 岁了,依然是命令行世界里传输数据的扛把子。别看它名字听着土(土到名字来源是 "see URL"),实际能力可一点都不土——HTTP、FTP、SMTP、POP3、SCP、SFTP……你能想到的协议它基本都支持。

今天就好好聊聊这个「古老」但「永不过时」的网络工具,看看它凭什么称霸命令行界这么多年。


⭐ 核心功能

1. 多协议支持
curl 支持超过 30 种协议,包括:

  • HTTP/HTTPS:GET、POST、PUT、DELETE 这些常规操作
  • FTP/SFTP/SCP:文件传输
  • SMTP/POP3/IMAP:邮件收发
  • WebSocket:长连接
  • REST API:接口调试神器

2. 丰富的请求选项

# 设置请求头
curl -H "Content-Type: application/json" \
     -H "Authorization: Bearer token" \
     https://api.example.com

# 发送 POST 请求带 JSON 数据
curl -X POST https://api.example.com/users \
     -d '{"name":"张三","email":"[email protected]"}'

# 上传文件
curl -F "file=@/path/to/file.txt" https://upload.example.com/

# 跟随重定向
curl -L https://example.com/redirect

# 设置超时时间
curl --max-time 30 https://example.com/

3. 身份认证

# Basic 认证
curl -u username:password https://api.example.com

# Bearer Token
curl -H "Authorization: Bearer your_token_here" https://api.example.com

# OAuth 2.0
curl -X POST https://auth.example.com/token \
     -d "grant_type=client_credentials" \
     -d "client_id=your_id" \
     -d "client_secret=your_secret"

4. 性能与调试

# 显示响应头
curl -I https://example.com

# 显示完整响应(包含头信息)
curl -i https://example.com

# 详细输出(包含请求过程)
curl -v https://example.com

# 测量请求时间
curl -w "@%{time_total}\n" -o /dev/null -s https://example.com

5. libcurl 库
curl 的核心是 libcurl,一个被广泛集成的 C 库。很多流行工具的后台网络请求都是靠它:Python 的 requests、PHP 的 Guzzle、Java 的 HttpClient……基本上你用的各种语言的 HTTP 客户端,底层很可能就是 libcurl。


📥 安装与使用

Linux/macOS
大多数发行版已经预装了 curl。没装的话:

# Ubuntu/Debian
sudo apt install curl

# macOS (Homebrew)
brew install curl

Windows
Windows 10+ 以上的 PowerShell 已经内置 curl(其实是 Invoke-WebRequest 的别名)。如果想要真正的 curl:

常用场景实战

1. 测试网站响应时间

curl -w "DNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" -o /dev/null -s https://www.baidu.com

2. 下载文件

# 普通下载
curl -O https://example.com/file.zip

# 断点续传
curl -C - -O https://example.com/largefile.zip

# 后台下载
curl -# -o output.zip https://example.com/file.zip &

3. 调用 REST API

# GET 请求
curl https://api.github.com/repos/curl/curl

# POST 创建资源
curl -X POST https://api.example.com/items \
     -H "Content-Type: application/json" \
     -d '{"title":"新项目","description":"这是一个测试项目"}'

# 上传 JSON 文件
curl -X POST https://api.example.com/upload \
     -H "Content-Type: application/json" \
     -d @data.json

4. 调试 HTTPS 问题

# 忽略证书错误(测试环境用)
curl -k https://example.com

# 查看完整证书信息
curl -v --cacert ca-bundle.crt https://example.com

# 指定 TLS 版本
curl --tlsv1.2 https://example.com

🎯 适用场景

谁适合用 curl?

  1. 后端开发者 - 快速测试 API 接口,不用打开 Postman
  2. 运维工程师 - 检查服务可用性、监控接口响应时间
  3. 安全工程师 - 测试防火墙规则、验证证书配置
  4. 数据工程师 - 抽取公开 API 数据、做 ETL 脚本
  5. 普通用户 - 下载文件、测试网络速度、验证 CDN 节点

说白了,只要跟网络请求打交道,curl 都能派上用场。


🔍 对比与替代方案

curl vs wget

特性curlwget
协议支持30+较少
下载方式输出到 stdout直接保存文件
递归下载不支持支持
断点续传支持支持
用途传输数据下载文件

wget 更适合下载文件,curl 更适合接口调试和数据传输。

curl vs HTTPie
HTTPie 的设计目标是「让人读懂 HTTP」,语法更自然:

# HTTPie
http GET api.example.com/users

# 等价 curl
curl https://api.example.com/users

但 curl 的参数更丰富,灵活性更高。

curl vs Postman/Insomnia
图形化工具适合管理复杂的 API 集合,但:

  • 无法集成到脚本里
  • 无法在服务器无界面环境使用
  • 无法做自动化测试

所以命令行选手还是离不开 curl。


⚠️ 注意事项

  1. Windows PowerShell 的 curl 是别名
    PowerShell 里输入 curl 实际调用的是 Invoke-WebRequest,不是真正的 curl。如果需要真正的 curl,用 curl.exe 明确调用。
  2. 敏感信息别留在命令行历史
    密码、Token 直接放命令里会被记录到 shell 历史,建议用环境变量:

    TOKEN="your_secret_token"
    curl -H "Authorization: Bearer $TOKEN" https://api.example.com
  3. 默认不验证证书
    -k 参数会跳过证书验证,测试环境可以用,生产环境千万别这么干!
  4. 大文件下载注意磁盘空间
    curl 不会检查目标路径是否有足够空间,小心下载一半爆盘。
  5. HTTPS 代理问题
    如果公司有代理,curl 需要单独配置:

    curl --proxy http://proxy.example.com:8080 https://example.com

✅ 总结

curl 之所以火了快 30 年,靠的是:

  • 极简设计:输入 URL,就能拿到结果
  • 协议全面:没有它搞不定的传输场景
  • 生态完善:libcurl 渗透到各种语言和工具里
  • 跨平台:Linux/macOS/Windows 全家桶

当然它也有缺点:参数太多(光帮助文档就几百行),新手容易懵。但一旦熟练了,绝对是真香神器。

推荐指数:⭐⭐⭐⭐⭐

适合人群:所有需要跟网络打交道的人(基本上就是所有人了)

GitHub 地址:https://github.com/curl/curl
官方网站:https://curl.se/


如果你还在用浏览器测试接口,赶紧试试 curl 吧!命令行调试 API 的效率,是图形界面给不了的。