玩转 Curl:常用参数与命令行结果输出实践 – wiki基地

玩转 Curl:常用参数与命令行结果输出实践

Curl 是一个功能强大的命令行工具,用于在命令行或脚本中传输数据。它支持多种协议,包括 HTTP、HTTPS、FTP、FTPS、SCP、SFTP 等。无论是测试 API、下载文件、调试网络请求,还是自动化任务,Curl 都是开发者和系统管理员的得力助手。

本文将详细介绍 Curl 的常用参数及其在命令行中输出结果的实践技巧。

1. Curl 是什么?

Curl 的全称是 “Client for URLs”,是一个开源项目,旨在提供一个用于传输数据的命令行工具和库(libcurl)。它被广泛应用于各种操作系统和开发环境中,因其灵活性和功能性而备受推崇。

2. 基本用法

最简单的 Curl 用法是直接后跟一个 URL,它会返回该 URL 的内容(通常是 HTML 或 JSON)。

bash
curl https://www.example.com

3. 常用参数详解

Curl 提供了数百个选项,以下是一些最常用且实用的参数:

3.1. 指定请求方法 (-X, --request)

当你需要发送 GET 以外的请求(如 POST, PUT, DELETE 等)时,可以使用 -X 参数。

“`bash

发送 POST 请求

curl -X POST https://api.example.com/data

发送 PUT 请求

curl -X PUT https://api.example.com/items/123
“`

3.2. 添加自定义请求头 (-H, --header)

在很多场景下,你需要发送自定义的 HTTP 请求头,例如设置 Content-TypeAuthorizationUser-Agent

“`bash

设置 Content-Type 为 JSON

curl -H “Content-Type: application/json” -X POST https://api.example.com/data -d ‘{“key”: “value”}’

添加 Authorization Bearer token

curl -H “Authorization: Bearer YOUR_TOKEN” https://api.example.com/protected_resource
“`

3.3. 发送数据 (-d, --data, --data-raw, --data-urlencode)

发送 POST、PUT 等请求时,通常需要携带请求体数据。

  • -d--data: 发送 application/x-www-form-urlencoded 格式的数据。如果数据包含空格或其他特殊字符,最好用单引号 ' 包裹。
  • --data-raw: 发送原始数据,不会对数据进行 URL 编码。常用于发送 JSON 或 XML。
  • --data-urlencode: 自动对数据进行 URL 编码。

“`bash

发送表单数据

curl -X POST -d “param1=value1&param2=value2” https://api.example.com/submit

发送 JSON 数据 (推荐使用 –data-raw 或 -H “Content-Type: application/json” -d)

curl -H “Content-Type: application/json” -X POST –data-raw ‘{“name”: “Alice”, “age”: 30}’ https://api.example.com/users

URL 编码数据

curl -X POST –data-urlencode “text=Hello World!” https://api.example.com/encode
“`

3.4. 使用 GET 方法发送数据 (-G, --get)

尽管 GET 请求通常通过 URL 参数发送数据,但你也可以使用 -G 参数配合 -d 参数来构建 GET 请求的 URL。Curl 会自动将 -d 中的数据附加到 URL 后。

“`bash
curl -G -d “param1=value1&param2=value2” https://api.example.com/search

等同于: curl https://api.example.com/search?param1=value1&param2=value2

“`

3.5. 身份验证 (-u, --user)

用于发送 HTTP Basic Authentication 凭据。

bash
curl -u "username:password" https://api.example.com/secure_resource

3.6. 处理 Cookies (-b, --cookie-c, --cookie-jar)

  • -b--cookie: 在请求中发送 cookies。
  • -c--cookie-jar: 将服务器返回的 cookies 保存到文件中。

“`bash

发送现有 cookie

curl -b “session_id=12345; user=Alice” https://www.example.com/profile

登录并保存 cookie

curl -c cookies.txt -X POST -d “username=test&password=password” https://www.example.com/login

使用保存的 cookie 访问其他页面

curl -b cookies.txt https://www.example.com/dashboard
“`

3.7. 跟随重定向 (-L, --location)

当请求的 URL 返回 3xx 状态码(重定向)时,Curl 默认不会跟随。使用 -L 参数可以使其自动跟随重定向。

bash
curl -L http://shorturl.at/abcde

3.8. 保存输出到文件 (-o, --output-O, --remote-name)

  • -o <file>: 将服务器响应保存到指定文件中,文件名由你指定。
  • -O: 根据远程文件名保存输出。这对于下载文件非常方便。

“`bash

保存网页到 index.html

curl -o index.html https://www.example.com

下载远程文件,并以其原始文件名保存(例如,如果 URL 是 /image.jpg,则保存为 image.jpg)

curl -O https://www.example.com/images/logo.png
“`

3.9. 静默模式 (-s, --silent)

抑制 Curl 的进度条、错误信息和其他不必要的输出,只显示请求体。这在需要脚本处理纯净响应时非常有用。

bash
curl -s https://api.example.com/status

3.10. 详细模式 (-v, --verbose)

显示请求和响应的详细信息,包括请求头、响应头、SSL/TLS 握手信息等。对于调试非常有用。

bash
curl -v https://www.example.com

3.11. 忽略 SSL 证书验证 (-k, --insecure)

在测试或开发环境中,有时需要连接使用自签名证书或无效证书的 HTTPS 服务器。-k 参数会忽略 SSL 证书验证警告。在生产环境中应避免使用此选项。

bash
curl -k https://test-server.example.com

3.12. 使用代理 (--proxy)

通过指定代理服务器进行请求。

bash
curl --proxy http://your_proxy_ip:port https://www.example.com

4. 命令行结果输出实践

Curl 的输出可以根据需求进行调整,以便于阅读、调试或集成到脚本中。

4.1. 默认输出:响应体

不带任何输出选项时,Curl 默认将服务器响应体(如 HTML、JSON、XML 等)输出到标准输出。

“`bash
curl https://api.github.com/users/octocat

输出 Octocat 的 JSON 数据

“`

4.2. 查看请求和响应的完整细节 (-v)

如前所述,-v 选项可以让你看到请求如何发送以及响应如何接收的所有细节,包括:
* DNS 解析
* 尝试连接的 IP 地址和端口
* SSL/TLS 握手过程
* 发送的请求头
* 接收的响应头
* 响应体

bash
curl -v https://www.example.com

4.3. 只查看响应头 (-I, --head)

如果你只关心响应头(例如,检查状态码、Content-TypeSet-Cookie 等),可以使用 -I--head 参数。这会发送一个 HEAD 请求,只返回响应头。

bash
curl -I https://www.example.com

4.4. 组合使用 -s-v 进行调试

当你需要调试,但又不希望看到进度条时,可以结合使用 -s-v

“`bash
curl -s -v https://www.example.com

仍然会显示详细信息,但不会有进度条

“`

4.5. 仅获取 HTTP 状态码 (-s -o /dev/null -w "%{http_code}")

这是一个非常实用的技巧,尤其是在脚本中检查服务的可用性。
* -s: 静默模式,不显示响应体和进度条。
* -o /dev/null: 将响应体重定向到空设备,不显示也不保存。
* -w "%{http_code}": 使用 write-out 选项,指定只输出 HTTP 状态码。

“`bash
curl -s -o /dev/null -w “%{http_code}” https://www.example.com

输出:200

“`

你还可以使用 -w 参数输出更多信息,例如:

  • %{url_effective}: 最终的 URL (重定向后)
  • %{time_total}: 请求的总时间
  • %{size_download}: 下载的字节数
  • %{content_type}: 响应的 Content-Type

“`bash
curl -s -o /dev/null -w “Status: %{http_code}\nTotal time: %{time_total}s\n” https://www.example.com

输出示例:

Status: 200

Total time: 0.123s

“`

4.6. 保存输出到文件并显示进度 (--progress-bar)

当你下载大文件并希望看到进度条时,-O-o 默认会显示进度。如果需要强制显示进度条(例如与 -s 结合使用时),可以使用 --progress-bar

bash
curl -O --progress-bar https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.6.14.tar.xz

5. 总结

Curl 是一个多功能且不可或缺的工具,掌握其常用参数和输出技巧将大大提高你的工作效率。通过灵活运用 -X-H-d 等参数进行请求定制,并通过 -v-I-s-w 等选项控制输出,你可以轻松地与任何 HTTP 服务进行交互、调试问题并自动化任务。

不断实践是精通 Curl 的关键。希望本文能帮助你更好地“玩转 Curl”!

滚动至顶部