本文最后更新于 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.comcurl 会自动请求新地址。

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

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
# 保存 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 头)。

6. 常见错误排查与解决方案

错误代码原因与解决方法
400 Bad Request请求数据格式错误(如 JSON 格式不正确)。使用 -v 检查请求体。
401 Unauthorized认证失败。检查 -uAuthorization 头是否正确。
404 Not FoundURL 路径错误。确认资源地址是否正确。
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 的核心功能,并灵活应对实际开发中的各种网络请求场景。