【发布时间】:2015-12-05 22:20:34
【问题描述】:
是否可以指示 cURL 禁止输出响应正文?
在我的例子中,响应正文是一个 HTML 页面,它会溢出 CLI 缓冲区,因此很难找到相关信息。我想检查输出的其他部分,例如 HTTP 响应代码、标头等。 - 所有除了实际的HTML。
【问题讨论】:
是否可以指示 cURL 禁止输出响应正文?
在我的例子中,响应正文是一个 HTML 页面,它会溢出 CLI 缓冲区,因此很难找到相关信息。我想检查输出的其他部分,例如 HTTP 响应代码、标头等。 - 所有除了实际的HTML。
【问题讨论】:
只需发出 HEAD 请求。您将获得没有正文的标头。符合标准的服务器应该在此处发送与 GET 请求完全相同的信息。
curl --head <url>
或者,如果 HEAD 请求由于某种原因对您不起作用,以下内容将使 cURL 发送 GET 请求,然后打印响应代码和标头并删除连接而不接收响应正文 - 与其他接收然后丢弃它的答案不同。这可以节省大量时间和带宽,尤其是在主体非常大的情况下。
curl --head -X GET <url>
您可以对任何其他动词进行同样的操作(例如POST),只需将其提供给-X 选项而不是GET。
【讨论】:
-X POST 不起作用? -X 覆盖发送的动词,但保持 Curl 的行为与 --head 不同——接收并仅显示响应代码和标头。
curl --head -X <verb> 发送 <verb>,而不是 HEAD。
显示响应标头并隐藏正文的另一个选项:
curl -sD - https://example.com -o /dev/null
【讨论】:
我建议以下解决方案:
curl -sS -i https://example.com | perl -e '$p = 1; while(<STDIN>){ $p = 0 if $_ =~ /^\s*$/; print if $p }'
这是一个较长的单线,但可以满足您的需要:
output="$(curl -i ....)"
curl 参数【讨论】:
这是一种抑制所有 curl 输出和标题的方法,如果发生错误,仍然可以选择显示错误。对于 cron 作业或自动化测试很有用。
抑制所有输出:
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 隐藏成功输出--show-error 显示错误,即使启用了silent 模式--fail 如果 HTTP 响应是错误代码(404、500 等)而不仅仅是 DNS/TCP 错误,则会引发错误。
更新:我意识到原作者想要检查请求的标头和响应代码,而不是让一切静音。有关如何执行此操作的详细信息,请参阅samael's answer。
【讨论】:
NUL 和/dev/null。使用 -sIXGET 是 IMO 更好的选择。
curl -vo/dev/null/curl -voNUL……我不知道是否有这样的便携式变体,hrm……;-)。
curl -Ssfo /dev/null url。但请善待未来的维护者。
当您想显示标题但隐藏响应正文时,您需要使用:
curl -sIXGET http://somedomain.com/your/url
我一直在使用 curl -I http://somedomain.com/your/url 来显示响应标头。但是,问题在于它使用HEAD method 发出请求,这在您想要测试仅响应GET 请求的API 调用时并不好。这就是-X GET 的用途,它将请求更改为GET。
所以,总结一下:
-s 隐藏输出的进度条(在管道到另一个程序时特别有用)-I 显示标题(但发出HEAD 请求)-XGET 将请求转换回@ 987654333@请求
见:http://www.woolie.co.uk/article/curl-full-get-request-dropping-body/
【讨论】:
curl -i 做同样的事情。
-i 在输出和正文中包含 HTTP 标头。试试吧。 curl -i http://google.com 与 curl -IXGET http://google.com 不一样
curl -I url 就足够了,并且具有相同的效果。我只需要检查 url 是否响应。这个问题也只是关于压制身体,HEAD 做得很好。
您可以使用-o 开关和null 伪文件:
curl -s -o /dev/null -v http://google.com
curl -s -o nul -v http://google.com
【讨论】:
-s -o nul,但在我的 Windows 机器上,curl -s -o nul -v http://{internal-host}/{internal-uri} 输出页面的整个 html——我尝试了curl -s -o nul -v http://google.com,它确实按预期抑制了输出,所以我不明白为什么这对我的内部网站不起作用
-o 只指定一个 URL 输出:如果你有多个 url,它只会丢弃第一个 :(
NUL 和/dev/null。使用 -sIXGET 是 IMO 更好的选择。