CURL
本文最后更新于 2025-06-12,文章内容可能已经过时。
curl
是一个功能强大的命令行工具,用于在各种协议之间传输数据。它支持 HTTP、HTTPS、FTP、FTPS、SMTP、IMAP、SFTP 等众多协议,广泛用于调试网络请求、下载文件、测试 API 接口等场景。
基本语法
curl [选项] [URL]
常用选项(Options)
选项 | 说明 |
---|---|
-o <file> | 将输出写入文件(可指定文件名) |
-O | 将输出写入与远程文件同名的本地文件 |
-s | 静默模式(不显示进度条或错误信息) |
-L | 跟随重定向(当服务器返回301/302时自动跳转) |
-I | 获取响应头信息(不获取正文) |
-X <method> | 指定请求方法(GET、POST、PUT、DELETE 等) |
-d <data> | 发送 POST 数据(常用于表单提交) |
-H <header> | 添加自定义请求头 |
-u <user:password> | 使用基本认证 |
-A <user-agent> | 设置 User-Agent 字符串 |
-v | 显示详细的请求和响应过程(调试神器) |
1. 基础操作详解
1.1 发送 GET 请求
curl https://example.com
- 默认行为:发送
GET
请求,获取并输出网页内容。 - 扩展说明
- 若目标地址是 HTML 页面,输出会直接显示文本内容。
- 若目标地址是 JSON API,输出会显示结构化数据(如
{"name": "John", "age": 30}
)。
1.2 保存响应内容到文件
curl -o output.html https://example.com
curl -O https://example.com/file.zip
-
参数说明
-o filename
:将响应内容写入指定文件名(本地自定义)。-O
:自动使用远程文件名保存(例如file.zip
)。
-
示例
curl -O https://example.com/images/logo.png # 保存为 logo.png
1.3 显示响应头信息
curl -I https://example.com
-
作用:仅获取 HTTP 响应头(如
HTTP/2 200
,Content-Type: text/html
)。 -
典型输出:
HTTP/2 200 content-type: text/html; charset=UTF-8 content-length: 1234 date: Mon, 01 Jan 2024 00:00:00 GMT
1.4 跟随重定向
curl -L https://example.com
- 作用:自动跟随
3xx
重定向(如301 Moved Permanently
)。 - 示例
- 如果
https://example.com
返回301
并指向https://new-location.com
,curl
会自动请求新地址。
- 如果
2. 发送不同类型的 HTTP 请求
2.1 POST 请求(表单数据)
curl -X POST -d "name=John&age=30" https://api.example.com/submit
- 参数说明
-X POST
:指定请求方法为POST
。-d
:附加数据(默认以application/x-www-form-urlencoded
格式发送)。请求头自动添加:Content-Type: application/x-www-form-urlencoded
2.2 发送 JSON 数据
curl -X POST \
-H "Content-Type: application/json" \
-d '{"name":"John", "age":30}' \
https://api.example.com/submit
- 关键点
-H
添加自定义请求头(这里是Content-Type: application/json
)。-d
的内容需为合法 JSON 格式。
- 常见错误
- JSON 格式错误会导致服务器返回
400 Bad Request
。
- JSON 格式错误会导致服务器返回
2.3 PUT/DELETE 请求
# PUT 请求
curl -X PUT -d '{"name":"John", "age":31}' https://api.example.com/update/123
# DELETE 请求
curl -X DELETE https://api.example.com/delete/123
- 注意事项
DELETE
请求通常不需要-d
参数(除非后端要求传递数据)。PUT
请求常用于更新资源,需确保 URL 包含资源标识符(如/update/123
)。
2.4 文件上传
curl -X POST -F "file=@/path/to/file.txt" https://api.example.com/upload
-
参数说明
-F
表示多部分表单(multipart/form-data
)。@
后接本地文件路径。
-
扩展示例
curl -X POST -F "file=@/home/user/report.pdf" -F "description=Quarterly Report" https://api.example.com/upload
3. 调试与性能分析
3.1 显示详细信息(调试模式)
curl -v https://example.com
-
输出内容
- 请求头(如
User-Agent
,Accept
)。 - 响应头(如
HTTP/2 200
,Set-Cookie
)。 - SSL 握手过程(如果使用 HTTPS)。
- 请求头(如
-
典型输出片段
> GET / HTTP/2 > Host: example.com > User-Agent: curl/8.3.0 < HTTP/2 200 < Content-Type: text/html
3.2 查看请求耗时
curl -w "%{http_code} %{time_total}\n" -o /dev/null https://example.com
- 参数说明
-w
:自定义输出格式。%{http_code}
:HTTP 状态码。%{time_total}
:总耗时(秒)。
- 其他时间指标
%{time_connect}
:连接耗时。%{time_starttransfer}
:开始传输耗时。
3.3 忽略 SSL 证书验证
curl -k https://example.com
- 使用场景:测试环境或自签名证书。
- 风险:不推荐在生产环境使用,可能引发中间人攻击。
4. 认证与安全机制
4.1 HTTP 基本认证
curl -u username:password https://example.com
-
原理:在请求头中添加
Authorization: Basic base64encode("username:password")
。 -
示例
bash深色版本
curl -u admin:secret123 https://api.example.com/secure
4.2 Bearer Token 认证
curl -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com
4.3 Cookie 处理
# 保存 Cookie 到文件
curl -c cookies.txt https://example.com/login
# 使用保存的 Cookie 发送请求
curl -b cookies.txt https://example.com/dashboard
- 应用场景:模拟登录后的会话保持。
- 扩展
- 使用
-c
和-b
可同时读写 Cookie(如curl -c cookies.txt -b cookies.txt ...
)。
- 使用
5. 高级功能与技巧
5.1 限制下载速度
curl --limit-rate 100k https://example.com
- 作用:控制下载速度为 100 KB/s。
- 用途:避免占用过多带宽。
5.2 通过代理发送请求
curl -x http://proxy.example.com:8080 https://example.com
- 参数说明
-x
:指定代理地址和端口。
- 支持协议:HTTP、HTTPS、SOCKS4/5。
5.3 自定义请求头
bash深色版本
curl -H "X-Custom-Header: MyValue" https://example.com
- 典型用途
- API 版本控制(如
Accept: application/vnd.api+json; version=2
)。 - 身份验证(如
Authorization
头)。
- API 版本控制(如
6. 常见错误排查与解决方案
错误代码 | 原因与解决方法 |
---|---|
400 Bad Request | 请求数据格式错误(如 JSON 格式不正确)。使用 -v 检查请求体。 |
401 Unauthorized | 认证失败。检查 -u 或 Authorization 头是否正确。 |
404 Not Found | URL 路径错误。确认资源地址是否正确。 |
500 Internal Server Error | 服务器内部错误。联系服务提供方或检查 API 文档。 |
SSL 证书错误 | 使用 -k 跳过验证(测试环境),或更新 CA 证书包。 |
7. 实际应用场景示例
7.1 调用 RESTful API
# 创建用户
curl -X POST -H "Content-Type: application/json" -d '{"username":"alice"}' https://api.example.com/users
# 获取用户信息
curl -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/users/1
curl --location 'localhost:10086/agriculture-web/attachment/importData/mdb/cbfjtcy'
curl --location 'localhost:10086/agriculture-web/attachment/importData/shp/dk'
7.2 自动化脚本中的使用
#!/bin/bash
TOKEN=$(curl -s -u client_id:client_secret -X POST https://auth.example.com/token | jq -r .access_token)
curl -H "Authorization: Bearer $TOKEN" https://api.example.com/data
- 说明:先获取 Token,再调用受保护的 API。
7.3 性能测试(并发请求)
ab -n 100 -c 10 https://example.com/
- 说明:虽然
curl
本身不支持并发,但可结合ab
(Apache Benchmark)进行压测。
8. 扩展知识
- 支持的协议:HTTP、HTTPS、FTP、FTPS、SCP、SFTP、SMTP、IMAP 等。
- 数据格式:支持 JSON、XML、表单数据、二进制文件等。
- 脚本化:可结合
jq
解析 JSON 响应,或结合grep
/awk
处理文本。
通过以上详细说明,你可以全面掌握 curl
的核心功能,并灵活应对实际开发中的各种网络请求场景。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 软件从业者Hort
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果