深入理解 `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

  1. 可通过 https://curl.se/windows/ 下载。
  2. 或使用 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 都是开发者日常工具链的重要一环。

推荐进一步阅读:


posted @ 2025-05-14 21:26  雨中遐想  阅读(162)  评论(0)    收藏  举报