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

查看原始版本

命令行curl可以使用-D选项显示响应头,但我想看看它发送的是什么请求头。我该怎么做?

所有回答
  • Bishop Lee #1

    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
    
  • Natividad Lee #2

    显示[rpstrong 1]标题的常用答案,但OP询问了[rpstrong 2]标题。

    curl -sD - -o /dev/null http://example.com
    
    • -s-避免显示进度条
    • -D --将头转储到文件,但-将其发送到stdout
    • -o /dev/null-忽略响应正文

    这比-I好,因为它不发送HEAD请求,这会产生不同的结果

    它比-v好,因为你不需要太多的黑客来解开它

  • Rita Lee #3

    我相信您要传递给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
    
  • Samantha Lee #4

    verbose选项很方便,但是如果您希望看到curl所做的一切(包括传输的HTTP主体,而不仅仅是头),我建议使用以下选项之一:

    • --trace-ascii -#标准输出
    • --trace-ascii output_file.txt#文件
  • Jeremy Lee #5

    您可以使用以下命令获得一个很好的头输出:

     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

    此外,每一行的方向都有指示,便于阅读。我发现追踪长链的重定向特别有用

  • Murray Lee #6

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

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

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

  • Colin Lee #7

    下面这样的命令将显示三个部分:请求头、响应头和数据(用CRLF分隔)。它避免了卷曲带来的技术信息和句法噪声

    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-将stdout和stderr合并为单个stdout
    • sed-curl使用下面的命令生成的编辑响应
    • /^* /d-删除以“*”开头的行(技术信息)
    • /bytes data]$/d-删除以“字节数据”结尾的行(技术信息)
    • s/> //-删除“>”前缀
    • s/< //-删除“<;”前缀
  • Sam Lee #8

    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选项是禁止进度测量

  • Harry Lee #9

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

    例如:OSX

    brew install httpie
    

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

    http GET https://www.google.com
    

    enter image description here