使用curl从HTTP POST仅获取响应标头


561

人们可以仅请求使用HTTP HEAD报头,作为选项-Icurl(1)

$ curl -I /

冗长的HTML响应正文在命令行中很麻烦,因此我只想获取标头作为对POST请求的反馈。但是,HEAD和POST是两种不同的方法。

如何获取curl以仅显示POST请求的响应标头?

Answers:


773
-D, --dump-header <file>
       Write the protocol headers to the specified file.

       This  option  is handy to use when you want to store the headers
       that a HTTP site sends to you. Cookies from  the  headers  could
       then  be  read  in  a  second  curl  invocation by using the -b,
       --cookie option! The -c, --cookie-jar option is however a better
       way to store cookies.

-S, --show-error
       When used with -s, --silent, it makes curl show an error message if it fails.

-L/--location
      (HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response
      code), this option will make curl redo the request on the new place. If used together with -i/--include or -I/--head, headers from  all  requested
      pages  will  be  shown.  When authentication is used, curl only sends its credentials to the initial host. If a redirect takes curl to a different
      host, it won’t be able to intercept the user+password. See also --location-trusted on how to change this. You can limit the amount of redirects to
      follow by using the --max-redirs option.

      When curl follows a redirect and the request is not a plain GET (for example POST or PUT), it will do the following request with a GET if the HTTP
      response was 301, 302, or 303. If the response code was any other 3xx code, curl will re-send the following  request  using  the  same  unmodified
      method.

从手册页。所以

curl -sSL -D - www.acooke.org -o /dev/null

跟随重定向,将标头转储到stdout并将数据发送到/ dev / null(这是GET,而不是POST,但是您可以对POST执行相同的操作-只需添加已经用于发布数据的任何选项)

请注意-后面的-D,它指示输出“文件”为stdout。


22
如果您使用的是Powershell,则以上注释有效。供cmd.exe使用curl -s -D - http://yahoo.com -o nul
-JJS

1
@JJS对我来说$ null在Win7上工作。是由于Windows上安装了cLink。
萨蒂亚·普拉卡什

17
URL前面的“-”似乎并不重要,但并非如此。
Wahid Sadik 2013年

1
@WahidSadik为什么特别如此?单破折号的作用是什么?
mamachanko

4
@mamachanko带有-D一个参数,指出输出应该去哪里。单破折号表示应该转到标准输出。
安德鲁·库克

172

其他答案需要下载响应正文。但是有一种方法可以发出一个仅获取标头的POST请求:

curl -s -I -X POST http://www.google.com

一个-I由自身执行HEAD请求可以通过重写-X POST来执行POST(或任何其他)请求,仍然只能得到标题数据。


15
这个答案实际上是正确的,因为Web服务器可以基于请求方法返回不同的标头。如果要检查GET上的标头,则必须使用GET请求。
chhantyal '16

6
我认为这是最正确的答案。很容易记住,它实际上发送了GET请求,并且没有下载整个响应主体(或者至少没有输出它)。该-s标志也不是必需的。
Skozin

@JeffPuckettII有点挑剔我会说。您可以在上述命令中替换GETPOST,它将按预期运行。or any other是关键。
chhantyal

18
当您实际上想要POST一些数据时,这将不起作用。卷毛说:Warning: You can only select one HTTP request method! You asked for both POST Warning: (-d, --data) and HEAD (-I, --head).
SebastianH

2
@nickboldt此处的要点是,服务器对HEAD请求的响应可能与对POST或GET请求的响应不同(某些服务器实际上对此进行响应),因此-X HEAD这里没有可靠的解决方案。
siracusa'1

58

以下命令显示其他信息

curl -X POST http://httpbin.org/post -v > /dev/null

您可以要求服务器仅发送HEAD,而不发送完整响应

curl -X HEAD -I http://httpbin.org/

Note:在某些情况下,服务器可能会为post和HEAD发送不同的标头。但是在几乎所有情况下,标题都是相同的。


5
不幸的是,另一个答案成功了,因为这是正确的答案-它不会不必要地传输大量数据。
丹尼尔(Daniel)

1
@dmd如果我-X, --request正确理解了cURL手册,-X HEAD仍然会产生“大量数据”,但是有-I, --head哪些应该导致您期望的结果。
Daniel AR Werner

1
您不正确地理解它。 -X HEAD并且-I是完全等价的。
丹尼尔(Daniel)

18
问题-X HEAD在于服务器可能会以不同的方式响应,因为它现在接收到的是HEAD请求(而不是GET先前的请求)(而不是以前的请求)
Grav

4
Warning: Setting custom HTTP method to HEAD with -X/--request may not work the Warning: way you want. Consider using -I/--head instead.
多里安

53

对于长响应主体(以及其他各种类似情况),我使用的解决方案始终是通过管道传递给less,因此

curl -i https://api.github.com/users | less

要么

curl -s -D - https://api.github.com/users | less

会做的工作。


这些不是等效的。第一个发出一个HEAD请求,许多服务器对此做出不同的响应。第二个发出的GET请求更像我们在这里寻找的请求。
glasz

25

也许这有点极端,但是我使用的是这个超短版本:

curl -svo. <URL>

说明:

-v 打印调试信息(确实包含标题)

-o.将网页数据(我们要忽略的数据)发送到某个文件,.在这种情况下,该文件是目录,并且是无效的目标,并导致输出被忽略。

-s没有进度条,没有错误信息(否则您将看到Warning: Failed to create the file .: Is a directory

警告:结果总是失败(就错误代码而言,无论是否可达)。请勿在shell脚本中使用条件语句...


1
为什么用-o.代替-o /dev/null
bfontaine

@bfontaine -o.-o /dev/null为了简洁起见
exebook '19

它没有相同的行为,因此仅使用它来保存8个字符是很奇怪的。
bfontaine

2
@bfontaine还有其他答案显示了如何以最正确的方式执行此操作,这是在这里显示基本上可以完成相同操作的简短选择。
exebook '19

您应该在答案中阐明该命令总是失败。由于make 返回非零(=错误)的代码,curl -svo. <url> && echo foo因此不会打印:。foo-o.curlcurl: (23) Failed writing body
bfontaine



3

headcurl.cmd(Windows版本)

curl -sSkv -o NUL %* 2>&1
  • 我不要进度条-s
  • 但是我确实想要错误-S
  • 不用担心有效的https证书-k
  • 越来越冗长-v(这是有关故障排除的,对吗?),
  • 没有输出(以干净的方式)。
  • 哦,我想将stderr转发到stdout,这样我就可以对整个事情进行grep(因为大多数或所有输出都来自stderr)
  • %*表示[将所有参数传递给此脚本](好(https://stackoverflow.com/a/980372/444255),通常这只是一个参数:您正在测试的url

实际示例(有关代理问题的故障排除):

C:\depot>headcurl google.ch | grep -i -e http -e cache
Hostname was NOT found in DNS cache
GET HTTP://google.ch/ HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: http://www.google.ch/
Cache-Control: public, max-age=2592000
X-Cache: HIT from company.somewhere.ch
X-Cache-Lookup: HIT from company.somewhere.ch:1234

Linux版本

为您的.bash_aliases/ .bash_rc

alias headcurl='curl -sSkv -o /dev/null $@  2>&1'

这将下载主体并消耗带宽和时间。@siracusa的答案(stackoverflow.com/a/38679650/6168139)没有这种开销。
rushi

如果需要&,则在需要POST时将其添加-X POST到passthrough参数中;如果需要GET,请使用GET(即默认值),因为响应可能会有所不同。-除非您在生产脚本中进行严重卷曲(不用于诊断和开发),否则我不会在乎带宽。
Frank Nocke

我正计划查看服务器上的文件是否已使用“上次修改时间”进行了更新。文件本身很大,有些文件以GB为单位,而且我通常在移动互联网上。因此,这个大带宽对我来说是个问题。
rushi

那会很骇人。我不需要这样做,因为siracusa的答案可以准确地执行任务。
rushi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.