ChatGPT解决这个技术问题 Extra ChatGPT

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

命令行 curl 可以使用 -D 选项显示响应标头,但我想查看它发送的请求标头。我怎样才能做到这一点?

curl --head http://google.com 将与 -I 标志相同:)
使用 --head/-I 的注意事项:并非所有服务器对 HEAD 请求的响应完全相同(例如,如果您尝试验证正文是否会被 gzip 压缩,则 Content-Encoding 将丢失)并且并非所有服务器支持HEAD-v 通常是更安全的选择。

A
Asaph

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 我认为这是因为它不仅显示了请求标头,还显示了响应标头和响应正文。
A
AmyChodorowski

显示响应标头的流行答案,但 OP 询问了请求标头。

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
尽管这个问题要求提供请求标头,但谷歌正在指导所有正在寻找响应标头的人,所以我们都很高兴这个答案就在这里。这个答案是获取响应标头的最佳选择。谢谢!!!
J
JJD

我相信您正在寻找传递给 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 开关。
如果您尝试使用除 HEAD 请求以外的任何其他请求(如 -X POST)并得到“您只能选择一个 HTTP 请求!”,那么 stackoverflow.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 会同时打印响应标头和正文。
E
Elijah Lynn

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

--trace-ascii - # 标准输出

--trace-ascii output_file.txt # 文件


我不这么认为,因为它也显示了响应标头和正文!
B
Benibr

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

 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 更高票数的选项更好。此外,为了简洁起见,只要 o 出现在末尾,它也可以是 curl -Lvso /dev/null <target>
i
igorpcholkin

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

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

该命令将产生以下输出:

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

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://stackoverflow.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=.stackoverflow.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://stackoverflow.com/">here</a></body>

描述:

-vs - 添加标题 (-v) 但删除进度条 (-s)

2>&1 - 将标准输出和标准错误合并成一个标准输出

sed - 使用以下命令编辑 curl 生成的响应

/^* /d - 删除以 '* ' 开头的行(技术信息)

/bytes data]$/d - 删除以 'bytes data]' 结尾的行(技术信息)

s/> // - 删除 '> ' 前缀

s/< // - 删除 '< ' 前缀


j
jpfx1342

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

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

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


t
toolchainX

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

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

仅获取请求头字段:

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

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

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

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


S
Sudharshan

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

例如:- 对于 OSX

brew install httpie

然后您可以使用各种选项在命令行上use

http GET https://www.google.com

https://i.stack.imgur.com/6RIUO.png