如何使用命令行 curl 显示请求标头

     2023-02-24     57

关键词:

【中文标题】如何使用命令行 curl 显示请求标头【英文标题】:How to display request headers with command line curl 【发布时间】:2011-03-16 05:39:08 【问题描述】:

命令行 curl 可以使用-D 选项显示响应头,但我想看看它发送的是什么请求头。我该怎么做?

【问题讨论】:

curl --head http://google.com 将与-I 标志相同:) 使用 --head/-I 的注意事项:并非所有服务器对 HEAD 请求的响应完全相同(例如,如果您尝试验证正文,Content-Encoding 将丢失将被压缩)并且并非所有服务器都支持HEAD-v 通常是更安全的选择。 How can I see the request headers made by curl when sending a request to the server? 的可能重复项 【参考方案1】:

curl 的 -v--verbose 选项显示 HTTP 请求标头等。这是一些示例输出:

$ curl -v http://google.com/
* About to connect() to google.com port 80 (#0)
*   Trying 66.102.7.104... connected
* Connected to google.com (66.102.7.104) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.16.4 (i386-apple-darwin9.0) libcurl/7.16.4 OpenSSL/0.9.7l zlib/1.2.3
> Host: google.com
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=UTF-8
< Date: Thu, 15 Jul 2010 06:06:52 GMT
< Expires: Sat, 14 Aug 2010 06:06:52 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact
* Closing connection #0

【讨论】:

如果我只想构建包但不想发送呢? @jacobsimeon 我认为这是因为它不仅显示了 Request headers,还显示了 Response headersResponse body .【参考方案2】:

显示 response 标头的流行答案,但 OP 询问 request 标头。

curl -s -D - -o /dev/null http://example.com
-s : 避免显示进度条 -D - :将标头转储到文件中,但 - 将其发送到标准输出 -o /dev/null :忽略响应正文

这比-I 更好,因为它不发送HEAD 请求,这会产生不同的结果。

它比-v 更好,因为您不需要这么多的技巧来取消它的详细程度。

【讨论】:

阅读问题 - 这是针对响应标头而不是请求标头 这个答案对我很有用,因为我也误读了这个问题。 这个命令对于 Windows 有点不同:curl -sD - -o NULL http://example.com @SergeyVlasov 实际上,Windows 中/dev/null 的等价物是nul,而不是null 尽管这个问题要求提供请求标头,但谷歌正在引导所有正在寻找响应标头的人,所以我们都很高兴这个答案在这里。这个答案是获取响应标头的最佳选择。谢谢!!!【参考方案3】:

我相信您正在寻找传递给 curl 的命令行开关是 -I

示例用法:

$ curl -I http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287  
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:05 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

此外,如果您遇到响应 HTTP 状态代码 301,您可能还希望传递一个 -L 参数开关来告诉 curl 遵循 URL 重定向,并且在这种情况下,打印所有页面的标题(包括 URL 重定向),如下图所示:

$ curl -I -L http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 302 Found
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Set-Cookie: UID=b8c37e33defde51cf91e1e03e51657da
Location: noaccess.php
Content-Type: text/html

HTTP/1.1 200 OK
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Content-Type: text/html

【讨论】:

-I 选项显示 response 标头。问题是关于 request 标头。 -I 选项导致 curl 执行 HTTP HEAD,这可能会更改来自服务器的响应。我相信最好使用-v switch。 如果您尝试使用除HEAD 请求之外的任何其他请求(如-X POST)并得到“您只能选择一个HTTP 请求!” 而不是***.com/questions/286982/…可能会帮助你。问题是-I 做了一个HEAD 请求,就像acw 所说的那样,当您的curl 呼叫设置为进行另一个呼叫时,您在curl 呼叫中有两个HTTP 请求...... 这是一个非常错误的答案。 (我保证我在这里通常很友善。) 1. 它与 OP 的要求相反。 2.它使用HEAD的请求方法,而不是GETPOST。 3. 除非您试图查看您的服务器对HEADGET 的响应有何不同,否则它绝不应该用于“仅查看标题”。大多数时候都是一样的,但并非总是如此。要仅查看标题,请使用 curl -o /dev/null -D /dev/stdout。这将在 100% 的时间内给出预期结果。 可能值得一提的是-i 会同时打印响应标头和正文。【参考方案4】:

详细选项很方便,但如果您想查看 curl 所做的所有操作(包括传输的 HTTP 正文,而不仅仅是标头),我建议使用以下选项之一:

--trace-ascii -#标准输出 --trace-ascii output_file.txt#文件

【讨论】:

我不这么认为,因为它也显示了响应标题和正文!【参考方案5】:

您可以使用以下命令获得漂亮的标题输出:

 curl -L -v -s -o /dev/null google.de
-L, --location 关注重定向 -v, --verbose更多输出,指明方向 -s, --silent 不显示进度条 -o, --output /dev/null 不显示收到的正文

或更短的版本:

 curl -Lvso /dev/null google.de

结果:

* Rebuilt URL to: google.de/
*   Trying 2a00:1450:4008:802::2003...
* Connected to google.de (2a00:1450:4008:802::2003) port 80 (#0)
> GET / HTTP/1.1
> Host: google.de
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.de/
< Content-Type: text/html; charset=UTF-8
< Date: Fri, 12 Aug 2016 15:45:36 GMT
< Expires: Sun, 11 Sep 2016 15:45:36 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 218
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
<
* Ignoring the response-body
 [218 bytes data]
* Connection #0 to host google.de left intact
* Issue another request to this URL: 'http://www.google.de/'
*   Trying 2a00:1450:4008:800::2003...
* Connected to www.google.de (2a00:1450:4008:800::2003) port 80 (#1)
> GET / HTTP/1.1
> Host: www.google.de
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 12 Aug 2016 15:45:36 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1
< P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."
< Server: gws
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< Set-Cookie: NID=84=Z0WT_INFoDbf_0FIe_uHqzL9mf3DMSQs0mHyTEDAQOGY2sOrQaKVgN2domEw8frXvo4I3x3QVLqCH340HME3t1-6gNu8R-ArecuaneSURXNxSXYMhW2kBIE8Duty-_w7; expires=Sat, 11-Feb-2017 15:45:36 GMT; path=/; domain=.google.de; HttpOnly
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
<
 [11080 bytes data]
* Connection #1 to host www.google.de left intact

如您所见,curl 同时输出传出和传入的标头,并跳过 bodydata 以告诉您主体有多大。

此外,每行都标明了方向,以便于阅读。我发现追踪长长的重定向链特别有用。

【讨论】:

我更喜欢这个比-v 更高票数的选项。此外,为了简洁起见,这也可以是 curl -Lvso /dev/null &lt;target&gt;,只要 o 出现在末尾即可。【参考方案6】:

像下面这样的命令将显示三个部分:请求标头、响应标头和数据(由 CRLF 分隔)。它避免了 curl 添加的技术信息和语法噪音。

curl -vs www.***.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'

该命令将产生以下输出:

GET / HTTP/1.1
Host: www.***.com
User-Agent: curl/7.54.0
Accept: */*

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://***.com/
Content-Length: 149
Accept-Ranges: bytes
Date: Wed, 16 Jan 2019 20:28:56 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-bma1622-BMA
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1547670537.588756,VS0,VE105
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Set-Cookie: prov=e4b211f7-ae13-dad3-9720-167742a5dff8; domain=.***.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly

<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="https://***.com/">here</a></body>

说明:

-vs - 添加标题 (-v) 但删除进度条 (-s) 2&gt;&amp;1 - 将标准输出和标准错误合并成一个标准输出 sed - 使用以下命令编辑 curl 生成的响应 /^* /d - 删除以“*”开头的行(技术信息) /bytes data]$/d - 删除以 'bytes data]' 结尾的行(技术信息) s/&gt; // - 删除 '> ' 前缀 s/&lt; // - 删除 '

【讨论】:

【参考方案7】:

在调试 Web 应用程序时,我必须自己解决这个问题。 -v 很棒,但对我的口味来说有点冗长。这是我想出的(仅限 bash)解决方案:

curl -v http://example.com/ 2> >(sed '/^*/d')

这是因为-v 的输出被发送到stderr,而不是stdout。通过将其重定向到子shell,我们可以sed 它删除以* 开头的行。由于真正的输出不通过子shell,所以不受影响。使用 subshel​​l 有点笨拙,但这是将 stderr 重定向到另一个命令的最简单方法。 (正如我所指出的,我只是将它用于测试,所以它对我来说很好。)

【讨论】:

【参考方案8】:

curl 的 -v 选项在包含前导 *(状态行)或 &gt;(请求头字段)或 &lt;(响应头字段)的错误输出中过于冗长。仅获取请求头字段:

curl -v -sS www.***.com 2>&1 >/dev/null | grep '>' | cut -c1-2 --complement

只获取请求头字段:

curl -v -sS www.***.com 2>&1 >/dev/null | grep '<' | cut -c1-2 --complement

或使用 -D 选项将其转储到 /tmp/test.txt 文件中

curl -D /tmp/test.txt -sS www.***.com > /dev/null

为了过滤-v输出,你应该将错误输出定向到终端,将std输出定向到/dev/null,-s选项是禁止进度计量

【讨论】:

【参考方案9】:

如果您想要更多替代方案,您可以尝试安装现代命令行 HTTP 客户端,例如 httpie,该客户端可用于大多数带有 brew、apt-get、pip、yum 等软件包管理器的操作系统

例如:- 对于 OSX

brew install httpie

然后你就可以在命令行中use它使用各种选项

http GET https://www.google.com

【讨论】:

如何从 curl 请求中获取响应时间(通过命令行)

】如何从curl请求中获取响应时间(通过命令行)【英文标题】:Howtogetresponsetimefromcurlrequest(viacommand-line)【发布时间】:2015-08-0101:27:57【问题描述】:如何捕获CURL请求的响应时间?curlhttps://www.google.com【问题讨论】:【参考方案1... 查看详情

curl的用法指南(代码片段)

简介curl是常用的命令行工具,用来请求Web服务器。它的名字就是客户端(client)的URL工具的意思。它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代Postman这一类的图形界面工具。本文介绍它的主要命令... 查看详情

AFNetworking:如何在请求中设置 Content-Type HTTP 标头?

】AFNetworking:如何在请求中设置Content-TypeHTTP标头?【英文标题】:AFNetworking:HowtosetContent-TypeHTTPHeaderinrequest?【发布时间】:2014-11-1523:21:48【问题描述】:使用命令行向我的API服务器注册我的客户的方法是curl-d\'"email":"e","memberExtern... 查看详情

向服务器发送请求时,如何查看 curl 生成的请求标头?

】向服务器发送请求时,如何查看curl生成的请求标头?【英文标题】:HowcanIseetherequestheadersmadebycurlwhensendingarequesttotheserver?【发布时间】:2010-10-2609:37:12【问题描述】:当我向服务器发送请求时,我想查看curl生成的请求标头。... 查看详情

如何使用 telnet 发出请求?

】如何使用telnet发出请求?【英文标题】:Howtomakearequestwithtelnet?【发布时间】:2013-12-1905:42:42【问题描述】:这就是问题所在,使用firefox的livehttp标头插件,我看到该站点的标头是GET/HTTP/1.1。现在,当我从命令行telnetwww.***.com80t... 查看详情

查看包含 POST 数据的 cURL 请求标头

...etewithPOSTdata【发布时间】:2011-10-1911:34:30【问题描述】:如何使用php中的libcurl查看完整的请求标头,包括发布数据?我正在尝试模拟一个页面的发布,当从浏览器完成并在LiveHTTPHeaders中查看时,它看起来像这样:https://###.comPOST/... 查看详情

PHP cURL 自定义标头

...布时间】:2011-12-2806:39:51【问题描述】:我想知道是否/如何在PHP中向cURLHTTP请求添加自定义标头。我正在尝试模拟iTunes如何抓取艺术品并使用这些非标准标题:X-Apple-Tz:0X-Apple-Store-Front:143444,12如何将这些标头添加到请求中?【问... 查看详情

使用 PHP 时使用 socks5 代理的 cURL 请求失败,但它通过命令行工作

】使用PHP时使用socks5代理的cURL请求失败,但它通过命令行工作【英文标题】:cURLrequestusingsocks5proxyfailswhenusingPHP,butitworksthroughthecommandline【发布时间】:2013-02-0308:12:30【问题描述】:cURL+代理菜鸟在这里,很难。我在尝试通过代... 查看详情

linux运维命令curl-日常用法总结

...习惯上称url为下载工具。下面就日常运维中基于curl命令使用做下总结一、Curl命令用法1.curl语法和参数选项#curl[option][url]curl常见参数2.curl使用说明curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准... 查看详情

linux命令行:curl的十种常见用法(代码片段)

1.获取页面内容当我们不加任何选项使用curl时,默认会发送GET请求来获取链接内容到标准输出。curlhttp://www.codebelief.com2.显示HTTP头如果我们只想要显示HTTP头,而不显示文件内容,可以使用-I选项:curl-Ihttp://www.codebelief.com输出为:... 查看详情

sh使用curl从url请求获取标头(代码片段)

查看详情

将命令行 cURL 请求转换为 PHP cURL 请求(PayPal API)

】将命令行cURL请求转换为PHPcURL请求(PayPalAPI)【英文标题】:ConvertingcommandlinecURLrequesttoPHPcURLrequest(PayPalAPI)【发布时间】:2017-05-2522:48:38【问题描述】:这是PayPal对其PermissionsAPI的命令行cURL请求示例:curlhttps://svcs.sandbox.paypal.com... 查看详情

如何在 PHP (cURL) 中附加这种格式的 HTTP 标头? [复制]

】如何在PHP(cURL)中附加这种格式的HTTP标头?[复制]【英文标题】:HowdoIappendanHTTPheaderinthisformatinPHP(cURL)?[duplicate]【发布时间】:2020-06-0422:47:26【问题描述】:我正在尝试使用cURL在PHP中发出GET请求,这是文档中关于我的标头的内容... 查看详情

如何使用 PHP(cURL)中的 post 方法在正文中发送带有标头的 JSON 数据 [重复]

】如何使用PHP(cURL)中的post方法在正文中发送带有标头的JSON数据[重复]【英文标题】:HowtosendJSONdatainbodywithheaderusingpostmethodinPHP(cURL)[duplicate]【发布时间】:2018-07-1222:24:51【问题描述】:我尝试使用以下代码在post方法中使用json... 查看详情

为啥 curl 无法使用选项 -i 显示 http 标头

】为啥curl无法使用选项-i显示http标头【英文标题】:whycurlcannotdisplayhttpheaderbyusingoption-i为什么curl无法使用选项-i显示http标头【发布时间】:2021-08-0406:29:04【问题描述】:我使用curl工具在http协议中获取某些内容,并打算使用选... 查看详情

如何在 PHP 的 cURL POST HTTP 请求中包含授权标头?

】如何在PHP的cURLPOSTHTTP请求中包含授权标头?【英文标题】:HowtoincludeAuthorizationheaderincURLPOSTHTTPRequestinPHP?【发布时间】:2012-09-0202:40:50【问题描述】:我正在尝试通过GmailOAuth2.0访问用户的邮件,我正在通过Google的OAuth2.0Playground... 查看详情

curl命令行参数及使用

参考技术Ah2表单提交h4GET数据提交h4post数据提交ps:提交内容:请求方式路径http版本协议2.host网址3.user-agent用什么软件发起请求4.Accept:/接受返回任何内容例响应内容1.路径版本协议2.key值3.回车分界线4.要上传的数据例ps:请求响应... 查看详情

linux或mac命令行更优雅的使用curl命令,以及命令行常用的快捷键说明(代码片段)

...博主,没有想到我阅读量最高的一篇博文居然是介绍如何在命令行使用curl命令的文章《curl模拟GET\\POST请求,以及curlpost上传文件》。这实在是太让我惊讶了,看来大家对于命令行的使用还是有很多需求 查看详情