CURL 抑制响应正文

是否可以指示 cURL 禁止响应体的输出?

在我的例子中,响应主体是一个 HTML 页面,它溢出了 CLI 缓冲区,使得很难找到相关信息。我想检查输出的其他部分,比如 HTTP 响应代码、头文件等等——所有的 除了实际的 HTML。

147372 次浏览

您可以使用 -o开关和 null伪文件:

Unix

curl -s -o /dev/null -v http://google.com

窗户

curl -s -o nul -v http://google.com

下面是一种抑制所有旋度输出和标头的方法,如果出现错误,还可以选择显示错误。对于 cron 作业或自动化测试非常有用。

Unix

禁止所有输出:

curl --silent --output /dev/null http://example.com

抑制输出,但在出现错误时仍显示错误:

curl --silent --output /dev/null --show-error --fail http://example.com

窗户

禁止所有输出:

curl --silent --output nul http://example.com

抑制输出,但在出现错误时仍显示错误:

curl --silent --output nul --show-error --fail http://example.com

参数说明

--silent取消正在下载的统计信息(但仍然显示 HTML 输出)
--output /dev/null隐藏了成功的输出
即使启用了 silent模式,--show-error也会显示错误
如果 HTTP 响应是错误代码(404,500等)而不仅仅是 DNS/TCP 错误,则 --fail将引发错误。


更新: 我意识到原作者想要检查请求的头部和响应代码,而不是关闭 一切。有关如何做到这一点的详细信息,请参阅 Samael 的回答

当希望显示标题但隐藏响应正文时,需要使用:

curl -sIXGET http://somedomain.com/your/url

我使用 curl -I http://somedomain.com/your/url只是为了显示响应头。但问题是,它使用 HEAD方法发出请求,当您想要测试只响应 GET请求的 API 调用时,这是不好的。这就是 -X GET的用途,它将请求更改为 GET

所以,总结一下:

-s从输出中隐藏了进度条(特别是当管道传输到另一个程序时)
-I显示标头(但发出 HEAD请求)
-XGET将请求转换回 GET请求

见: http://www.woolie.co.uk/article/curl-full-get-request-dropping-body/

只是 请求领导。你会得到没有身体的标题。标准编译服务器应该像发送 GET 请求一样发送完全相同的信息。

curl --head <url>

或者,如果一个 HEAD 请求由于某种原因不能为您工作,则使用 下面的代码将使 cURL 发送一个 GET请求,然后打印响应代码和头文件,并在不接收响应主体的情况下删除连接——不像其他回答那样接收然后丢弃它。这可以节省大量的时间和带宽,特别是如果体积非常大。

curl --head -X GET <url>

对于任何其他动词 (例如 POST) ,也可以这样做,方法是将它提供给 -X选项而不是 GET

我建议采取以下解决办法:

curl -sS -i https://example.com | perl -e '$p = 1; while(<STDIN>){ $p = 0 if $_ =~ /^\s*$/; print if $p }'

这是一个较长的一行程序,但能满足你的需要:

  • 身体被抑制了
  • 报头和响应代码是 output@stdout,因此您也可以将信息通过管道传递给另一个命令,或者在一个 shell 变量(如 output="$(curl -i ....)")中捕获它
  • 任何 cURL 错误都发送给@stderr
  • 这既适用于 GET 和 POST 请求,也适用于任何其他 HTTP 请求方法,并且可以使用其他标准 curl参数

另一个显示响应标题和压制主体的选项:

curl -sD - https://example.com -o /dev/null