:把响应头写入标准输出,让每次请求都“看得见“)
curl--show-headers-i把响应头写入标准输出让每次请求都看得见【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl导读--show-headers短选项-i是 curl 命令行工具中最常用的可视化调试开关之一它把服务器响应头与响应体一起输出到终端让 HTTP 版本、服务器名、Cookie、日期等关键信息直接可见对非 HTTP 协议如 FTP则展示其协议层面的服务器通信内容。本文以 docs/cmdline-opts/show-headers.md 为骨架结合本仓库 src、tests 中的源码实现与测试用例深入讲解该选项的行为、与--dump-header/--verbose的配合方式、终端样式化输出原理以及它与--fail、--head等选项的交互细节帮助你彻底掌握输出响应头这一高频调试姿势。一、选项速览什么是--show-headers在 curl 命令行工具中--show-headers的作用是把响应头显示在输出中。其完整定义位于本仓库的 docs/cmdline-opts/show-headers.md长选项--show-headers短选项-i作用Show response headers in output在输出中显示响应头适用协议HTTP、FTP分类important / verbose / output / http / ftp引入版本4.8当时名为--include类型布尔开关boolean可配合--no-show-headers关闭最基本的用法一行即可curl -i https://example.com或等价的长选项形式curl --show-headers https://example.comHTTP 响应头中可以包含服务器名称、Cookie、文档日期、HTTP 版本等信息对于非 HTTP 协议--show-headers输出的头则是服务器通信中的其他元数据。例如 FTP 会话中curl 会把服务器的状态行、响应行一并展示出来便于排查登录、切换目录等环节的异常。二、响应头与响应体同流和--dump-header的本质区别原文档特别强调了一个关键行为This option makes the response headers get saved in the same stream/output as the data.--dump-headerexists to save headers in a separate stream.也就是说--show-headers-i响应头与响应体写入同一个输出流顺序为先头后体二者混排在同一份输出中--dump-header-D把响应头单独写入另一个文件流响应体仍正常输出到标准输出或-o指定的文件两者互不干扰。如果既要终端上直观看到头又要把头归档成文件二者可以叠加使用。--dump-header的详细说明见 docs/cmdline-opts/dump-header.md。从源码看这两种行为由同一个回调函数承载。curl 命令行工具通过 src/config2setopts.c 中的CURLOPT_HEADERFUNCTION把每个响应头投递给 src/tool_cb_hdr.c 中实现的tool_header_cb回调。该回调内部依次处理三件事若设置了--dump-headerper-config-headerfile非空先把头写入独立的heads-stream并立即fflushsrc/tool_cb_hdr.c在 2xx/3xx 响应中提取etag:头配合--etag-save以及Content-Disposition/Location头配合--remote-header-name等若设置了show_headers且输出目标非空把响应头写入当前输出流详见下文样式化输出一节。由此可见头写哪、怎么写完全由tool_header_cb根据命令行配置统一分派这也解释了为什么--show-headers与--dump-header可以互不冲突地同时生效。三、终端样式化输出粗体字段名与Location:高亮原文档提到当 HTTP 响应头输出到tty终端时curl 可能使用转义码让响应头字段名以粗体显示并让Location:头中的 URL 被特殊标记。这一行为在源码中有明确实现。在 src/tool_cb_hdr.c 中可以看到if(hdrcbdata-config-show_headers !outs-out_null (scheme proto_http || scheme proto_https || scheme proto_rtsp || scheme proto_file)) { /* bold headers only for selected protocols */ ... if(global-isatty #ifdef _WIN32 tool_term_has_bold #endif global-styled_output) value memchr(ptr, :, cb); if(value) { size_t namelen value - ptr; curl_mfprintf(outs-stream, BOLD %.*s BOLDOFF :, (int)namelen, ptr); ... } }从中可以提炼出几个实现事实仅对特定协议启用粗体HTTP、HTTPS、RTSP、FILE 四类协议的头字段名会走样式化分支其他协议原样输出触发条件输出目标是终端global-isatty且--styled-output处于开启状态在 Windows 上还需终端支持粗体tool_term_has_boldLocation:特判当字段名是Location时其值中的 URL 会被write_linked_location特别标记src/tool_cb_hdr.c方便追踪重定向目标非头:值形态的行如空行、状态行直接整行写出src/tool_cb_hdr.c。如果你不希望终端出现这些样式转义码可以用--no-styled-output显式关闭。--styled-output的完整说明见 docs/cmdline-opts/styled-output.md其 Help 描述为 Enable styled output for HTTP headers即为 HTTP 响应头启用样式化输出默认仅在支持粗体的终端上生效。注意一个易混点--no-styled-output的写法是给布尔选项加--no-前缀来取反这正是 curl 对--styled-output这类布尔选项的标准取反约定——把--styled-output变成--no-styled-output即关闭样式。四、想看请求头用--verbose而不是--show-headers原文档明确提示To view the request headers, consider the --verbose option.--show-headers只负责展示响应头如果想要看到 curl 实际发出的请求头如Host:、User-Agent:、Accept:等应该使用--verbose-v。二者的定位差异可以这样记忆选项短选项展示内容输出方向--show-headers-i响应头与响应体同流输出--dump-header-D响应头独立文件流--verbose-v请求头、握手细节、传输过程标准错误流stderr--verbose的完整文档见 docs/cmdline-opts/verbose.md。实际排查问题时组合拳通常是curl -v -i https://example.com这样既能从 stderr 看到请求侧全过程又能在 stdout 看到带响应体的完整响应头。五、与其他选项的交互--fail、--head与重定向抑制5.1 与--fail的历史交互7.75.0 之前原文档记录了这样一段版本历史Prior to 7.75.0 curl did not print the headers if --fail was used in combination with this option and there was an error reported by the server.即在7.75.0 之前如果同时使用--fail-f和--show-headers当服务器返回错误状态时curl不会输出响应头从 7.75.0 起这一限制被移除错误响应下的响应头也会照常展示方便你在--fail抑制响应体的同时仍能读取到服务器的错误头信息。5.2 与--head的关系底层共享同一开关--head-I在源码层面与--show-headers有直接关联。在 src/tool_getparam.c 中可以看到case C_INCLUDE: /* --include */ case C_SHOW_HEADERS: /* --show-headers */ config-show_headers toggle; break; ... case C_HEAD: /* --head */ config-no_body toggle; config-show_headers toggle; ... break;两个实现要点C_INCLUDE旧名--include与C_SHOW_HEADERS共用同一分支都只是设置config-show_headers——这正是 8.10.0 改名后旧名称依然可用的源码证据--head内部会同时把no_body和show_headers置位因为它要发 HTTP HEAD 请求且不取响应体但响应头仍然要展示二者天然同源。5.3 重定向时的头输出抑制如果配合--location-L跟踪重定向默认情况下 curl 只会输出最终响应的头每跳的中间响应头会被抑制除非显式使用--include或--show-headers之外再叠加--suppress-connect-headers等开关调整细节。相关选项的交叉说明可见 docs/cmdline-opts/suppress-connect-headers.md 与 docs/cmdline-opts/location.md。六、名称演变从--include到--show-headers原文档指出This option was called --include before 8.10.0. The previous name remains functional.也就是说8.10.0 之前该选项名为--include短选项一直是-i8.10.0 起更名为--show-headers旧名--include仍然可用源码中C_INCLUDE与C_SHOW_HEADERS共用同一分支即为直接证据。因此在较新版本的 curl 中以下三条命令完全等价curl -i https://example.com curl --include https://example.com curl --show-headers https://example.com在阅读旧教程或旧脚本时如果遇到--include无需修改直接照用即可。七、实战场景与测试佐证7.1 常见实战组合快速查看响应头与状态curl -i https://api.example.com/status配合-O下载并同时看到头信息注意此时头与文件内容分离输出头走 stdout文件落盘curl -i -O https://example.com/file.zip配合--remote-header-name与-J保存远端文件名时也输出头curl -i -J -O https://example.com/download错误排查时把头归档到文件、正文输出到终端curl -i -D headers.txt -o body.html https://example.com7.2 仓库测试用例本仓库的测试套件对--show-headers有专门覆盖可作为行为验证依据tests/data/test1310HTTP GET with -J --show-headers测试在-J -O --show-headers --output-dir %LOGDIR组合下响应头会完整出现在输出中且Content-Disposition指定的远端文件名被正确落盘校验段file name%LOGDIR/name%TESTNUMBER中同时包含完整响应头和正文12345tests/data/data1461.txt 与 tests/data/test1492 也涉及该选项的解析与行为验证。这些测试印证了文档描述的核心行为开启--show-headers后响应头与响应体按先头后体的顺序写入同一输出流且与-J -O等文件下载选项可正常协同。八、小结--show-headers-i是 curl 中把响应头直接摆到眼前的最直接手段响应头与响应体同流输出适合快速查看状态行、服务器、日期、Cookie、HTTP 版本等信息需要把头单独存文件时改用/叠加--dump-header需要看请求头时改用/叠加--verbose在终端上HTTP/HTTPS/RTSP/FILE 协议的字段名默认可以粗体显示、Location:URL 可被特殊标记不想要样式就用--no-styled-output关闭该选项 8.10.0 之前叫--include旧名仍可用7.75.0 之前与--fail组合时错误响应不输出头的历史行为已变更。从 docs/cmdline-opts/show-headers.md 的定义到 src/tool_getparam.c 的选项解析、src/tool_cb_hdr.c 的头写出与样式化实现再到 tests/data/test1310 的端到端校验--show-headers的行为链路在仓库中清晰可查——下次排查 HTTP/FTP 问题时curl -i就是你最快的第一个动作。【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考