curl 定制输出:获取你想要的 API 调用信息
在日常开发、测试、系统管理和故障排查工作中,我们经常需要与各种 API 进行交互。而 curl
无疑是命令行下最强大、最灵活的 HTTP 客户端之一。它不仅仅是一个简单的网页下载工具,更是诊断网络问题、测试 API 的得力助手。
然而,当我们使用 curl
调用 API 时,默认的输出往往只显示响应体 (response body),这对于理解整个调用过程、诊断问题或从响应中提取特定信息来说是远远不够的。一个完整的 API 调用涉及请求头、响应头、状态码、传输时间、连接信息等一系列关键数据。
幸运的是,curl
提供了极其丰富的选项来定制其输出,让你能够精确地获取到你想要的那部分信息。本文将深入探讨 curl
的各种输出控制选项,特别是强大的 --write-out
(或 -w
)选项,帮助你轻松驾驭 API 调用的细节。
为什么需要定制 curl
输出?
在调用 API 时,我们可能需要获取以下信息:
- HTTP 状态码 (Status Code): 了解请求是成功 (如 200 OK, 201 Created) 还是失败 (如 400 Bad Request, 404 Not Found, 500 Internal Server Error),这是最基本的判断依据。
- 响应头部 (Response Headers): 包含服务器信息、内容类型、缓存策略、重定向位置 (Location)、Set-Cookie 等重要元数据。这些信息对于理解 API 的行为、处理缓存或跟踪重定向至关重要。
- 响应体 (Response Body): API 返回的实际数据,通常是 JSON、XML 或 HTML。
- 请求头部 (Request Headers): 查看
curl
实际发送了哪些头部信息,有助于调试认证、内容类型等问题。 - 连接和传输统计信息: 包括域名解析时间、TCP 连接建立时间、SSL 握手时间、等待服务器响应时间 (TTFB – Time To First Byte)、总传输时间、下载速度、上传速度、下载/上传字节数等。这些数据对于分析 API 性能瓶颈非常有帮助。
- 详细的通信过程: 查看
curl
与服务器之间的原始通信过程,包括发送的每一行请求、接收的每一行响应。
默认情况下,curl <url>
只会将响应体输出到标准输出。要获取上述其他信息,我们就需要使用 curl
的各种输出控制选项。
curl
的基本输出控制选项
在深入探讨强大的 --write-out
之前,我们先了解一些基础的输出控制选项。
1. 显示响应头部 (-i
, --include
)
当你需要查看 API 响应的头部信息以及响应体时,可以使用 -i
或 --include
选项。
bash
curl -i https://jsonplaceholder.typicode.com/posts/1
执行上述命令,curl
会先输出 HTTP 响应头部,然后是响应体。
“`
HTTP/1.1 200 OK
Date: Thu, 26 Oct 2023 08:00:00 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 280
Connection: keep-alive
X-Powered-By: Express
Vary: Origin
Access-Control-Allow-Credentials: true
Cache-Control: max-age=43200
Pragma: no-cache
Expires: -1
X-Content-Type-Options: nosniff
Etag: W/”118-xaC3p9d9tV7E9q8c8f8j8l8m8n8o8p8q8r8s8t8u8v8w8x8y8z”
Via: 1.1 vegur
CF-Cache-Status: HIT
Age: 1234
Server: cloudflare
CF-RAY: 81c6f0d8c0b5a1c7-CDG
alt-svc: h3=”:443″; ma=86400
{
“userId”: 1,
“id”: 1,
“title”: “sunt aut facere repellat provident occaecati excepturi optio reprehenderit”,
“body”: “quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut Griffith\nculpa det\nadipisci non\n”
}
“`
这对于查看状态码、内容类型、缓存头等信息非常方便。
2. 只显示响应头部 (-I
, --head
)
有时候,你可能只需要获取 API 的头部信息,而不需要下载整个响应体。例如,检查一个文件是否存在、获取其大小或修改时间,或者仅仅是检查站点的可访问性和状态码。这时可以使用 -I
或 --head
选项。
请注意,-I
选项通常会让 curl
发送一个 HEAD
请求而不是 GET
请求。HEAD
请求类似于 GET
请求,但服务器在响应中只返回头部,不会返回响应体。并非所有服务器和资源都支持 HEAD
请求。如果目标不支持 HEAD
,curl
可能会回退到 GET
并只显示头部(但通常仍会下载整个响应体,只是不显示)。
bash
curl -I https://jsonplaceholder.typicode.com/posts/1
输出会只有头部信息:
HTTP/1.1 200 OK
Date: Thu, 26 Oct 2023 08:00:00 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 280
Connection: keep-alive
X-Powered-By: Express
Vary: Origin
Access-Control-Allow-Credentials: true
Cache-Control: max-age=43200
Pragma: no-cache
Expires: -1
X-Content-Type-Options: nosniff
Etag: W/"118-xaC3p9d9tV7E9q8c8f8j8l8m8n8o8p8q8r8s8t8u8v8w8x8y8z"
Via: 1.1 vegur
CF-Cache-Status: HIT
Age: 1234
Server: cloudflare
CF-RAY: 81c6f0d8c0b5a1c7-CDG
alt-svc: h3=":443"; ma=86400
3. 显示详细过程 (-v
, --verbose
)
当 API 调用出现问题时,仅仅查看响应体或头部可能不够。-v
或 --verbose
选项会让 curl
输出它与服务器通信的每一个细节,包括请求的构建过程、发送的头部、SSL/TLS 握手信息、连接尝试等。
bash
curl -v https://jsonplaceholder.typicode.com/posts/1
输出会非常详细,用 *
标记连接信息,用 >
标记发送的请求头部,用 <
标记接收的响应头部。
“`
* Trying 172.67.73.153:443…
* Connected to jsonplaceholder.typicode.com (172.67.73.153) port 443 (#0)
* ALPN: offers h2
* ALPN: offers http/1.1
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: none
* TLSv1.0 (OUT), TLS handshake, Client hello (1):
* TLSv1.0 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-ECDSA-AES128-GCM-SHA256
* ALPN: server accepted h2
* Server certificate:
* subject: CN=jsonplaceholder.typicode.com
* start date: Oct 26 00:00:00 2023 GMT
* expire date: Oct 25 23:59:59 2024 GMT
* subjectAltName: host “jsonplaceholder.typicode.com” matched “jsonplaceholder.typicode.com”
* issuer: C=US; O=Google Trust Services LLC; CN=GTS R1
* SSL certificate verify ok.
* Using HTTP/2, server supports multiplexing
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 access window 256 -> 524288
* CSP: Pipelining: z
* CSP: Packaged pipelining: z
* CSP: multiplexing: y
* Found no cookies in the cookie jar.
GET /posts/1 HTTP/2
Host: jsonplaceholder.typicode.com
User-Agent: curl/7.81.0
Accept: /
- Using Stream ID: 1 (easy handle 0x55b3700249f0)
- Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
< HTTP/2 200
< date: Thu, 26 Oct 2023 08:00:00 GMT
< content-type: application/json; charset=utf-8
< content-length: 280
< x-powered-by: Express
< vary: Origin
< access-control-allow-credentials: true
< cache-control: max-age=43200
< pragma: no-cache
< expires: -1
< x-content-type-options: nosniff
< etag: W/”118-xaC3p9d9tV7E9q8c8f8j8l8m8n8o8p8q8r8s8t8u8v8w8x8y8z”
< via: 1.1 vegur
< cf-cache-status: HIT
< age: 1234
< server: cloudflare
< cf-ray: 81c6f0d8c0b5a1c7-CDG
< alt-svc: h3=”:443″; ma=86400
<
{
“userId”: 1,
“id”: 1,
“title”: “sunt aut facere repellat provident occaecati excepturi optio reprehenderit”,
“body”: “quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut Griffith\nculpa det\nadipisci non\n”
}- Connection #0 to host jsonplaceholder.typicode.com left intact
“`
-v
输出对于诊断低层网络问题、SSL 证书问题、重定向链等非常有用。
4. 静默模式 (-s
, --silent
)
在脚本中调用 curl
时,我们通常不希望看到下载进度条或任何非错误信息。-s
或 --silent
选项可以抑制这些额外输出,只显示最终的响应体或由其他选项(如 -w
)指定的输出。
bash
curl -s https://jsonplaceholder.typicode.com/posts/1
只会输出响应体:
json
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut Griffith\nculpa det\nadipisci non\n"
}
-s
选项经常与 --write-out
结合使用,以确保输出只包含我们通过 -w
精确指定的信息。
强大的 --write-out
选项
现在,我们来重点介绍 curl
最灵活、最强大的输出定制工具:--write-out
或其缩写 -w
。这个选项允许你指定一个格式字符串,curl
会在传输完成后根据这个格式字符串输出各种统计信息和变量。
--write-out
的基本用法
基本语法是 -w <format-string>
。<format-string>
是一个普通字符串,可以包含文本、转义序列(如 \n
表示换行,\t
表示制表符)以及最重要的——变量。变量以 %{
开头,以 }
结尾。
bash
curl -w "Status Code: %{http_code}\nTotal Time: %{time_total} seconds\n" https://jsonplaceholder.typicode.com/posts/1
这个命令会输出:
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut Griffith\nculpa det\nadipisci non\n"
}
Status Code: 200
Total Time: 0.123 seconds # 实际时间会变化
你会注意到,默认的响应体仍然被输出了。为了只获取 -w
指定的信息,我们需要结合使用 -s
(silent) 选项来抑制默认的响应体输出。
bash
curl -s -w "Status Code: %{http_code}\nTotal Time: %{time_total} seconds\n" https://jsonplaceholder.typicode.com/posts/1
输出将只包含 -w
指定的内容:
Status Code: 200
Total Time: 0.123 seconds
这是一个非常重要的组合:-s -w "..."
是在脚本中或需要结构化输出时获取特定信息的常用模式。
--write-out
支持的常用变量
--write-out
支持非常多的变量,覆盖了连接、传输、时间、大小等各个方面。以下是一些在 API 调用和性能分析中特别有用的变量列表:
变量名 | 描述 | 单位/格式 |
---|---|---|
http_code |
HTTP 状态码。如果发生重定向,这将是最后一个有效的状态码。 | 整数 |
http_connectcode |
CONNECT 请求的响应状态码。 | 整数 |
time_total |
整个操作的总时间(从开始到结束)。 | 秒 (浮点数) |
time_namelookup |
DNS 域名解析时间。 | 秒 (浮点数) |
time_connect |
TCP 连接建立时间(包括 name_lookup 时间)。 | 秒 (浮点数) |
time_appconnect |
SSL/SSH 等高级协议连接或握手时间(包括 connect 时间)。对于 HTTPS 请求,这通常是 SSL 握手完成的时间。 | 秒 (浮点数) |
time_pretransfer |
在文件传输开始之前的所有预备步骤完成时间(包括 name_lookup, connect, appconnect 时间)。 | 秒 (浮点数) |
time_starttransfer |
接收到第一个字节的时间(TTFB – Time To First Byte)。这包括了服务器处理请求并在响应中发送第一个字节所需的时间。 | 秒 (浮点数) |
size_download |
下载的总字节数。 | 字节 (整数) |
size_upload |
上传的总字节数。 | 字节 (整数) |
speed_download |
平均下载速度。 | 字节/秒 (浮点数) |
speed_upload |
平均上传速度。 | 字节/秒 (浮点数) |
num_connects |
建立的连接数。重用连接时可能小于请求数。 | 整数 |
num_redirects |
遵循的重定向次数。 | 整数 |
url_effective |
最终实际请求的 URL(处理重定向后)。 | 字符串 |
redirect_url |
如果发生重定向,这是下一个重定向的目标 URL。仅在设置了 -L (follow redirects) 并且服务器返回 3xx 状态码时有用。 |
字符串 |
remote_ip |
连接到的远程 IP 地址。 | 字符串 |
remote_port |
连接到的远程端口。 | 整数 |
local_ip |
用于连接的本地 IP 地址。 | 字符串 |
local_port |
用于连接的本地端口。 | 整数 |
content_type |
响应头部的 Content-Type 值。 | 字符串 |
filename_effective |
--remote-header-name 或 --remote-name 选项确定的本地文件名。 |
字符串 |
ssl_verify_result |
SSL 证书验证结果。0 表示成功。非零值表示失败。 | 整数 |
ssl_engine |
使用的 SSL 引擎名称。 | 字符串 |
primary_ip |
与 remote_ip 类似,但可能取决于配置。 |
字符串 |
primary_port |
与 remote_port 类似,但可能取决于配置。 |
整数 |
%{json:variable_name} |
如果响应体是 JSON,尝试解析 JSON 并提取指定路径的值(较新版本的 curl 支持)。注意:这需要 curl 编译时支持 JSON 解析,且功能有限。通常更推荐单独解析 JSON。 |
字符串 |
关于时间变量的说明:
理解时间变量对于性能分析至关重要:
time_namelookup
: 纯 DNS 解析时间。如果这个值很大,说明 DNS 解析是瓶颈。time_connect
: 建立 TCP 连接的时间。如果这个值很大(且 namelookup 正常),可能是网络延迟或防火墙问题。time_appconnect
: SSL 握手时间。对于 HTTPS,这是连接建立后的额外开销。如果这个值很大,可能是服务器 SSL 配置问题或客户端/服务器协商问题。time_pretransfer
: 从开始到发送请求前的所有准备时间。time_starttransfer
: 从开始到收到第一个字节的时间 (TTFB)。这包含了网络延迟、服务器处理时间和发送第一个字节的时间。如果time_pretransfer
正常但time_starttransfer
很大,说明服务器处理请求的时间很长。time_total
: 整个过程的总时间。
这些时间变量是累积的,即 time_connect
包含 time_namelookup
,time_appconnect
包含 time_connect
,依此类推。通过计算差值,可以得到各个阶段的纯耗时:
- DNS 解析纯耗时:
time_namelookup
- TCP 连接纯耗时:
time_connect
–time_namelookup
- SSL 握手纯耗时:
time_appconnect
–time_connect
(对于 HTTPS) - 服务器处理/TTFB 纯耗时:
time_starttransfer
–time_pretransfer
- 内容下载纯耗时:
time_total
–time_starttransfer
--write-out
格式字符串的转义序列
除了普通字符和变量,格式字符串还可以包含 C 语言风格的转义序列:
\n
: 换行符\r
: 回车符\t
: 制表符\\
: 反斜杠\%
: 字面百分号(如果需要输出%
本身而不是作为变量的开始)
这些转义序列对于格式化输出、使其更易读或易于脚本解析非常有用。
--write-out
的实用示例
让我们看一些如何使用 --write-out
获取不同信息的示例。
示例 1:获取状态码和总时间
bash
curl -s -w "HTTP Status: %{http_code}, Total Time: %{time_total}s\n" https://jsonplaceholder.typicode.com/posts/1
输出:
HTTP Status: 200, Total Time: 0.123s
示例 2:以多行格式获取关键性能指标
bash
curl -s -w "
HTTP Code: %{http_code}\n
Total Time: %{time_total}\n
Namlook Up: %{time_namelookup}\n
Connect: %{time_connect}\n
AppConnect: %{time_appconnect}\n
Pretransfer: %{time_pretransfer}\n
StartTransfer: %{time_starttransfer}\n
Download Size: %{size_download} bytes\n
Download Speed: %{speed_download} B/s\n
Effective URL: %{url_effective}\n
IP Address: %{remote_ip}\n
Content Type: %{content_type}\n
" https://jsonplaceholder.typicode.com/posts/1
输出(格式化后):
“`
HTTP Code: 200
Total Time: 0.123
Namlook Up: 0.005
Connect: 0.015
AppConnect: 0.030
Pretransfer: 0.030
StartTransfer: 0.080
Download Size: 280 bytes
Download Speed: 2280.123 B/s
Effective URL: https://jsonplaceholder.typicode.com/posts/1
IP Address: 172.67.73.153
Content Type: application/json; charset=utf-8
“`
注意,我将格式字符串放在了多行,但这在 bash 中是一个单一的字符串。你也可以将格式字符串定义在一个变量中,或者使用 -w @<filename>
从文件中读取格式。
示例 3:获取重定向信息
调用一个会发生重定向的 URL,并使用 -L
选项跟随重定向。
bash
curl -s -L -w "
Initial URL: %{url_effective}\n
Redirect Count: %{num_redirects}\n
Final URL: %{url_effective}\n
Last Redirect URL: %{redirect_url}\n # 注意这个变量只显示最后一个重定向的目标,不是链条上的
HTTP Code: %{http_code}\n
" http://github.com # http://github.com 会重定向到 https://github.com
输出:
“`
Initial URL: http://github.com/ # 这里的url_effective在重定向发生前就记录了
Redirect Count: 1
Final URL: https://github.com/ # 这里的url_effective是重定向后的最终URL
Last Redirect URL: https://github.com/
HTTP Code: 200
“`
可以看到 url_effective
在 --write-out
字符串的不同位置可能捕获到不同阶段的值(取决于 curl
处理 -w
的时机,但通常是最终URL)。redirect_url
则明确指出了最后一个重定向的目的地。对于复杂的重定向链,你可能需要多次调用 curl
或使用 -v
输出来跟踪。
示例 4:获取 Content-Type 和下载大小
bash
curl -s -w "Content-Type: %{content_type}, Size: %{size_download}\n" https://jsonplaceholder.typicode.com/posts/1
输出:
Content-Type: application/json; charset=utf-8, Size: 280
将格式字符串保存到文件
对于复杂的 -w
格式,将其保存在一个文件中会更便于管理和复用。创建一个文件,比如 curl-format.txt
:
“`txt
URL: %{url_effective}
IP: %{remote_ip}:%{remote_port}
HTTP Code: %{http_code}
Content Type: %{content_type}
Download Size: %{size_download} bytes
Total Time: %{time_total} s
DNS Lookup: %{time_namelookup} s
Connect Time: %{time_connect} s
SSL Handshake: %{time_appconnect} s
Time to First Byte: %{time_starttransfer} s
========================================
“`
然后使用 -w @filename
选项:
bash
curl -s -w @curl-format.txt https://jsonplaceholder.typicode.com/posts/1
输出会使用文件中定义的格式:
“`
URL: https://jsonplaceholder.typicode.com/posts/1
IP: 172.67.73.153:443
HTTP Code: 200
Content Type: application/json; charset=utf-8
Download Size: 280 bytes
Total Time: 0.123 s
DNS Lookup: 0.005 s
Connect Time: 0.015 s
SSL Handshake: 0.030 s
Time to First Byte: 0.080 s
========================================
“`
这种方式非常适合在脚本中重复使用或与团队成员分享标准化的性能测试格式。
控制响应体输出
当使用 -w
时,你通常只关心 -w
输出的信息,而不希望看到默认的响应体。我们已经使用了 -s
选项来抑制进度条和默认的响应体输出。但是,-s
选项会使 curl
完全静默,包括错误消息。在某些情况下,你可能希望在出错时看到错误信息,但成功时又不想看到响应体。
另一种控制响应体输出的方式是将其重定向到 /dev/null
(Linux/macOS) 或 NUL
(Windows)。这是一种通用的 Shell 重定向技术,与 curl
本身的选项正交。
bash
curl -s -w "HTTP Code: %{http_code}\n" https://jsonplaceholder.typicode.com/posts/1 -o /dev/null
这里:
-s
: 抑制进度条和非错误信息。-w "..."
: 输出指定格式的信息到标准输出。-o /dev/null
: 将响应体输出重定向到/dev/null
,即丢弃。
这样结合使用,可以确保只有 -w
指定的输出出现在标准输出中,而响应体被完全丢弃。
如果你想在成功时看到 -w
输出,失败时看到 curl
的错误信息(例如连接错误,而不是 HTTP 错误状态码),可以不使用 -s
,而是将响应体重定向到 /dev/null
,并将标准错误重定向到标准输出(以便在脚本中捕获错误信息):
bash
curl -w "HTTP Code: %{http_code}\n" https://jsonplaceholder.typicode.com/posts/1 -o /dev/null 2>&1
不过,-s
通常在只需要统计信息时更常用,因为它还能抑制其他一些额外的非错误输出。根据具体需求选择 -s
还是 -o /dev/null
(或两者结合)。
结合其他 curl
功能
定制输出的选项可以与 curl
的其他强大功能结合使用,例如:
- 发送数据 (
-d
,-F
,-X
): 测试 POST, PUT 等请求时,依然可以使用-w
来获取响应的状态码和性能信息。
bash
curl -s -X POST -d '{"title": "foo", "body": "bar", "userId": 1}' -H "Content-Type: application/json" -w "Status: %{http_code}, Time: %{time_total}s\n" https://jsonplaceholder.typicode.com/posts - 发送头部 (
-H
): 发送自定义头部时,输出控制选项依然有效。
bash
curl -s -H "X-My-Header: test" -w "Status: %{http_code}\nContent-Type: %{content_type}\n" https://jsonplaceholder.typicode.com/headers - 保存响应体 (
-o
,-O
): 如果你需要保存响应体到文件,同时又想在控制台看到统计信息,可以这样做:
bash
curl -w "HTTP Code: %{http_code}, Downloaded to: response.json\n" https://jsonplaceholder.typicode.com/posts/1 -o response.json
这里-w
的输出会立即显示,然后响应体会被保存到response.json
文件。由于没有-s
,curl
可能会显示下载进度。如果你想静默下载但仍输出-w
信息:
bash
curl -s -w "HTTP Code: %{http_code}, Downloaded to: response.json\n" https://jsonplaceholder.typicode.com/posts/1 -o response.json
进阶技巧与注意事项
- Shell 脚本中的应用:
-s -w
的组合在 Shell 脚本中进行 API 自动化测试、监控或数据收集时非常有用。你可以轻松地解析-w
的输出,提取状态码、时间等,并根据这些值进行判断或记录。使用文件中保存的-w
格式可以提高脚本的可读性和可维护性。 - 获取特定响应头部的值:
--write-out
主要用于输出传输统计信息和少数标准信息(如content_type
,url_effective
)。它不能直接通过变量获取任意指定的响应头部的值(例如Server
、X-Request-ID
)。要获取特定头部的值,你通常需要结合-i
或-I
输出头部信息,然后使用文本处理工具(如grep
,awk
,sed
)来解析输出。
bash
curl -s -I https://jsonplaceholder.typicode.com/posts/1 | grep -i "Server:" | awk '{print $2}'
这将输出cloudflare
。 - 引号的使用: 当
-w
的格式字符串包含空格或特殊字符时,务必使用双引号或单引号将其括起来。单引号'...'
可以防止 Shell 对其中的特殊字符(如$
,!
)进行解释,这在格式字符串中几乎总是更安全的选择。 - 错误处理:
--write-out
在curl
完成传输后执行。如果curl
在连接或传输过程中遇到严重错误(例如 DNS 解析失败、连接被拒绝),它可能根本无法完成传输,此时-w
的输出可能不会发生。在这种情况下,你需要依赖curl
默认的错误输出和其退出码 ($?
在 Shell 中) 来诊断问题。使用-f
(fail fast) 选项可以让curl
在 HTTP 状态码 >= 400 时立即失败并返回非零退出码,这有助于在脚本中进行错误检查。结合-s
和-f
并在-w
之后重定向标准错误是一个健壮的脚本处理方式。
总结
curl
的输出控制选项是其作为 API 调试和测试工具强大能力的重要组成部分。
- 使用
-i
或-I
可以轻松查看响应头部,快速了解状态、内容类型等元数据。 - 使用
-v
可以深入了解底层的通信过程,诊断连接、SSL 或请求构建问题。 - 而
--write-out
(-w
) 则是获取结构化性能指标和传输统计信息的终极利器。通过灵活运用其丰富的变量和格式化能力,你可以精确地提取出 HTTP 状态码、各种时间指标、下载/上传大小和速度、最终 URL 等宝贵信息。结合-s
选项可以抑制不必要的默认输出,使-w
的输出更干净,非常适合自动化脚本处理。
掌握这些选项,你就能更好地理解 API 调用的全貌,快速定位问题,并收集关键数据进行性能分析。无论是简单的状态检查,还是复杂的性能基准测试,curl
配合其强大的输出定制能力,都能成为你应对各种 API 交互场景的可靠伙伴。开始尝试使用 -w
吧,让 curl
输出为你所用,精准获取你所需的 API 调用信息!