curl (网络请求 / Client URL)

1. 定义

curl 是用命令行发送 HTTP/HTTPS/FTP 等网络请求的瑞士军刀工具,能从 URL 下载数据,也能向服务器提交数据。 几乎每个排查接口、联调后端、测试 API 的人都离不开它。

类比:curl 像是浏览器的”纯文本版”——不发渲染页面,只收发原始请求和响应,方便调试。

2. curl 能做什么

场景作用
接口联调手动发 GET/POST 请求,验证后端 API
下载文件从 URL 拉取文件、资源
排查网络看请求头、响应头、状态码、耗时
鉴权测试带 token / cookie 访问受保护接口
压测前探活确认服务可达、健康检查通过

3. 核心概念

  • URL:curl 后跟的第一个位置参数就是目标地址
  • 请求方法:默认 GET,可用 -X 指定 POST/PUT/DELETE 等
  • 请求头 -H:自定义 Header,如 Content-TypeAuthorization
  • 请求体 -d:发送数据(表单或 JSON)
  • -v 详细模式:打印完整的请求/响应过程,调试首选
  • -s 静默模式:不显示进度条,适合脚本

4. 常用命令

GET 与下载

curl https://api.example.com/users          # 默认 GET,输出响应体
curl -I https://example.com                 # -I 只看响应头(HEAD 请求)
curl -O https://example.com/file.zip         # -O 按原文件名保存
curl -o page.html https://example.com        # -o 指定保存文件名
curl -L https://example.com                  # -L 跟随重定向

POST 与数据提交

curl -X POST https://api.example.com/login \
  -d "username=ava&password=123"            # -d 表单格式提交
 
curl -X POST https://api.example.com/users \
  -H "Content-Type: application/json" \
  -d '{"name":"ava","age":20}'             # 提交 JSON
 
curl -X POST https://api.example.com/upload \
  -F "file=@photo.png"                     # -F 表单文件上传

鉴权与头部

curl https://api.example.com/me \
  -H "Authorization: Bearer <token>"       # 带 Bearer token
 
curl https://api.example.com \
  -H "Accept: application/json" \
  -b "sessionid=abc123"                    # -b 发送 cookie
  -c cookies.txt https://example.com        # -c 把响应 cookie 存到文件

调试与排查

curl -v https://api.example.com             # -v 打印完整收发过程
curl -s -o /dev/null -w "%{http_code}" https://example.com   # 只取状态码
curl -w "time_total=%{time_total}\n" https://example.com      # 看总耗时
curl -x http://proxy:8080 https://example.com                 # 走代理

5. curl vs 其他工具

工具特点何时用
curl通用、几乎系统自带、协议全调试接口、脚本里发请求、下载
wget递归下载、断点续传强批量/站点镜像下载
httpie (http)语法友好、输出彩色 JSON人工交互式 API 调试更顺手
PostmanGUI、可保存集合复杂接口测试、团队协作

6. 典型工作流

联调一个 JSON 接口

curl -X POST https://api.example.com/login \
  -H "Content-Type: application/json" \
  -d '{"user":"ava","pwd":"123"}' -v

健康检查 / 探活

code=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/health)
echo "status=$code"

下载并跟随重定向

curl -L -O https://github.com/owner/repo/archive/main.zip

7. 常见误区

  • ❌ “POST 用 -d 但服务器收不到 JSON”。没加 -H "Content-Type: application/json",服务器按表单解析导致字段为空。
  • ❌ “-X POST-d 不生效”。-d 会自动把方法设为 POST,多数情况不用写 -X POST,多余反而易错。
  • ❌ “脚本里 curl 输出一堆进度信息污染结果”。加 -s 静默,再配合 -o /dev/null -w 只取想要字段。
  • ❌ “HTTPS 证书报错直接 -k 跳过”。-k 关闭证书校验有安全风险,仅临时调试用,生产脚本别留。

8. 延伸阅读 / 关联概念

  • wget — 偏下载场景的命令行工具
  • httpie — 更人性化、彩色输出的 API 调试 CLI
  • HTTP 方法 / 状态码 / Header — 理解 curl 收发内容的底层
  • RESTful API 设计 —— curl 最常联调的对象
  • curl 官方文档:https://curl.se/docs/manpage.html