How to display request headers with command line curl

后端 未结 9 629
一整个雨季
一整个雨季 2020-11-28 17:19

Command line curl can display response header by using -D option, but I want to see what request header it is sending. How can I do that?

相关标签:
9条回答
  • 2020-11-28 18:05

    A command like the one below will show three sections: request headers, response headers and data (separated by CRLF). It avoids technical information and syntactical noise added by curl.

    curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'
    

    The command will produce the following output:

    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>
    

    Description:

    • -vs - add headers (-v) but remove progress bar (-s)
    • 2>&1 - combine stdout and stderr into single stdout
    • sed - edit response produced by curl using the commands below
    • /^* /d - remove lines starting with '* ' (technical info)
    • /bytes data]$/d - remove lines ending with 'bytes data]' (technical info)
    • s/> // - remove '> ' prefix
    • s/< // - remove '< ' prefix
    0 讨论(0)
  • 2020-11-28 18:11

    I had to overcome this problem myself, when debugging web applications. -v is great, but a little too verbose for my tastes. This is the (bash-only) solution I came up with:

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

    This works because the output from -v is sent to stderr, not stdout. By redirecting this to a subshell, we can sed it to remove lines that start with *. Since the real output does not pass through the subshell, it is not affected. Using a subshell is a little heavy-handed, but it's the easiest way to redirect stderr to another command. (As I noted, I'm only using this for testing, so it works fine for me.)

    0 讨论(0)
  • 2020-11-28 18:15

    If you want more alternatives, You can try installing a Modern command line HTTP client like httpie which is available for most of the Operating Systems with package managers like brew, apt-get, pip, yum etc

    eg:- For OSX

    brew install httpie
    

    Then you can use it on command line with various options

    http GET https://www.google.com
    

    0 讨论(0)
提交回复
热议问题