【问题标题】:cURL suppress response bodycURL 抑制响应正文
【发布时间】:2015-12-05 22:20:34
【问题描述】:

是否可以指示 cURL 禁止输出响应正文?

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

【问题讨论】:

    标签: curl output suppress


    【解决方案1】:

    只需发出 HEAD 请求。您将获得没有正文的标头。符合标准的服务器应该在此处发送与 GET 请求完全相同的信息。

    curl --head <url>
    

    或者,如果 HEAD 请求由于某种原因对您不起作用,以下内容将使 cURL 发送 GET 请求,然后打印响应代码和标头并删除连接而不接收响应正文 - 与其他接收然后丢弃它的答案不同。这可以节省大量时间和带宽,尤其是在主体非常大的情况下。

    curl --head -X GET <url>
    

    您可以对任何其他动词进行同样的操作(例如POST),只需将其提供给-X 选项而不是GET

    【讨论】:

    • 这对POST不起作用,还取决于服务器中HEAD的实现
    • @AllanDeamon -X POST 不起作用? -X 覆盖发送的动词,但保持 Curl 的行为与 --head 不同——接收并仅显示响应代码和标头。
    • 服务器实现HEADER。我看到了许多没有按预期工作的实现。但这里的重点是 HEADER 等价于 GET。正确的实现方法是完成 GET 所做的所有事情,然后只发送标头。因此,如果您想触发行为或其他动词(如 POST),则 HEAD 动词将不起作用。因此,当您使用 --head 时,它不会发送 GET,而是发送 HEAD。但是你不能发送 2 个 HTTP 动词。
    • @AllanDeamon 也许我不够清楚。 curl --head -X &lt;verb&gt; 发送 &lt;verb&gt;,而不是 HEAD
    • 是的,在这种情况下,我建议您编辑答案以使其更清楚,因为这似乎是一个有效的答案,但其他人可能和我有同样的误解。
    【解决方案2】:

    显示响应标头并隐藏正文的另一个选项:

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

    【讨论】:

      【解决方案3】:

      我建议以下解决方案:

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

      这是一个较长的单线,但可以满足您的需要:

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

      【讨论】:

        【解决方案4】:

        这是一种抑制所有 curl 输出和标题的方法,如果发生错误,仍然可以选择显示错误。对于 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 隐藏成功输出
        --show-error 显示错误,即使启用了silent 模式
        --fail 如果 HTTP 响应是错误代码(404、500 等)而不仅仅是 DNS/TCP 错误,则会引发错误。


        更新:我意识到原作者想要检查请求的标头和响应代码,而不是让一切静音。有关如何执行此操作的详细信息,请参阅samael's answer

        【讨论】:

        • 依赖于不可移植的NUL/dev/null。使用 -sIXGET 是 IMO 更好的选择。
        • 感谢@binki 的评论——他们实际上做了不同的事情。还意识到 OP 想要检查我的解决方案中没有显示的标题。我已经更新了我的答案以反映这一点。
        • 我猜在重读 OP 的帖子时,他们并没有说他们想查看标题。他们实际上可能一直在寻找curl -vo/dev/null/curl -voNUL……我不知道是否有这样的便携式变体,hrm……;-)。
        • 是否有用于--fail 的简短命令?我认为 -sS 是我们需要的 --silent 和 --show-error
        • 是的,有:curl -Ssfo /dev/null url。但请善待未来的维护者。
        【解决方案5】:

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

        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.comcurl -IXGET http://google.com 不一样
        • 对于我的目的(和 OP 的)curl -I url 就足够了,并且具有相同的效果。我只需要检查 url 是否响应。这个问题也只是关于压制身体,HEAD 做得很好。
        • 但是 HEAD / GET 可能会给您带来不同的结果。这是不一样的。特别是如果您需要这些类型的命令来解决正在发生的事情。我发现这个答案中的建议非常有帮助。 -i 和 -I 不一样。 -I 和 -sIXGET 不一样。
        【解决方案6】:

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

        Unix

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

        视窗

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

        【讨论】:

        • ... 如果您使用的是 Unix ;-) 对于 Windows,您可能想要使用 nul。这是文档的链接,也许 BaltoStar 在下次询问之前有阅读的冲动;-) curl.haxx.se/docs/manpage.html
        • 不客气。但它是“nul”,“null”将创建一个具有该名称的文件
        • 事实上,我在发布之前确实阅读了手册页并尝试了-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 更好的选择。
        猜你喜欢
        • 1970-01-01
        • 2015-11-07
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多