向服务器发送请求时,如何查看curl发出的请求标头?


Answers:


501

我认为curl -v是最简单的。它会吐出请求标头(以“>”开头的行),而无需写入文件:

$ curl -v -I -H "Testing: Test header so you see this works" http://stackoverflow.com/
* About to connect() to stackoverflow.com port 80 (#0)
*   Trying 69.59.196.211... connected
* Connected to stackoverflow.com (69.59.196.211) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: curl/7.16.3 (i686-pc-cygwin) libcurl/7.16.3 OpenSSL/0.9.8h zlib/1.2.3 libssh2/0.15-CVS
> Host: stackoverflow.com
> Accept: */*
> Testing: Test header so you see this works
>
< HTTP/1.0 200 OK
...

58
curl -v -D-stackoverflow.com -o / dev / null(为了不显示整个网站的内容,仅显示标题)
omn​​omnom

20
curl -Ivs http://example.com > /dev/null-I用于HEAD请求,-v显示已发送的标题,-s隐藏进度栏,> /dev/null仅显示-v输出,避免重复。
这里

@PiotrekDe -D -很整洁,但是对我没有用,因为它只是复制了-v已经显示的标题。如果您不希望它们带有前缀以自动使用机器,那么在这种情况下可能会更好,但是我只想更详细地了解问题所在。
Pysis

1
“ verbose”标志有两个非常有用的功能:首先,当通过HTTPS访问网站时,它还会打印TLS握手过程,例如curl -v https://www.example.com;其次,CONNECT如果您正在通过HTTP代理访问网站(例如),它还会打印请求curl --proxy my-proxy:8080 http://www.example.com。我相信如果在此答案中提到这两个功能的一些示例,它将对更多用户有帮助。
富兰克林·于

1
TL; DR:请勿使用-I在现代世界中,当人们问到看到标头时,他们可能在谈论API。而且,如果您使用“我曾经用-I我的Apache网络服务器来查看标题”的心态,那么HEAD当您可能打算使用时,将浪费大量时间来开发一种方法GET。不要告诉别人使用-I。如果他们愿意HEAD,请使用-X HEAD(TWSS)
Bruno Bronosky,

141

该问题未指定curl是指命令行命令的意思还是整个cURL库。

以下使用cURL库的PHP代码使用第一个参数作为HTTP方法(例如“ GET”,“ POST”,“ OPTIONS”),第二个参数作为URL。

<?php
$ch = curl_init();
$f = tmpfile(); # will be automatically removed after fclose()
curl_setopt_array($ch, array(
    CURLOPT_CUSTOMREQUEST  => $argv[1],
    CURLOPT_URL            => $argv[2], 
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FOLLOWLOCATION => 0,
    CURLOPT_VERBOSE        => 1,
    CURLOPT_HEADER         => 0,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT        => 30,
    CURLOPT_STDERR         => $f,
));
$response = curl_exec($ch);
fseek($f, 0);
echo fread($f, 32*1024); # output up to 32 KB cURL verbose log
fclose($f);
curl_close($ch);
echo $response;

用法示例:

php curl-test.php OPTIONS https://google.com

请注意,结果几乎与以下命令行相同

curl -v -s -o - -X OPTIONS https://google.com

这是最佳答案,因为此方法中使用的文件包含curl_getinfo()中下面引用的所有内容,以及有关请求和响应的更多详细信息。
Mike_K 2013年

3
您可以将CURLOPT_WRITEHEADER用于标题信息,并将CURLOPT_FILE用于整个传输
sturrockad 2014年

1
请记住,如果连接被拒绝,则用CURLOPT_WRITEHEADER 和指定的文件CURLOPT_FILE为空。
17:56

34
谁说了任何有关使用的内容php?
Eddie B

1
我赞成您的答案,因为虽然问题与php无关,但是基于php的答案将我引导到了正确的方向,以解决发送承载令牌的问题。谢谢。我在这里只说了我的理由,只是徒劳地尝试在以后的Google搜索具有类似问题的php开发人员中显示此问题。
克里斯,

49

我设法查看我的传出标头(使用php的curl)的唯一方法是使用以下选项:

curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

获取调试信息:

$data = curl_exec($ch);
var_dump($data);
var_dump(curl_getinfo($ch));

1
对我来说,这似乎是响应头而不是传出头。
托比,

3
var_dump $data将返回响应头以及响应主体。var_dump curl_getinfo($ch)将为您提供请求标头。
Jrgns 2012年

2
CURLOPT_HEADER是响应标头- CURLINFO_HEADER_OUT是请求标头。这就是OP所要求的:)
Richard Parnaby-King 2015年

44

--trace-ascii选项以卷曲将显示请求报头,以及响应头和响应主体。

例如,命令

curl --trace-ascii curl.trace http://www.google.com/ 

产生一个文件curl.trace,其开始如下:

== Info: About to connect() to www.google.com port 80 (#0)
== Info:   Trying 209.85.229.104... == Info: connected
== Info: Connected to www.google.com (209.85.229.104) port 80 (#0)
=> Send header, 145 bytes (0x91)
0000: GET / HTTP/1.1
0010: User-Agent: curl/7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3
0050:  OpenSSL/0.9.7l zlib/1.2.3
006c: Host: www.google.com
0082: Accept: */*
008f: 

它还记录了一个响应(准确地说是不相关的302响应)。


如果只想保存响应头,请使用以下--dump-header选项:

curl -D file url
curl --dump-header file url

如果您需要有关可用选项的更多信息,请使用curl --help | less(它会产生数百行输出,但会提及很多选项)。或在手册页中找到有关选项含义的更多说明。


10
-D为您提供响应头(与-I一样,但为STDIN)。该问题要求提供请求标头。
2009年

34

curl --trace-ascii {filename}或使用单破折号代替文件名将其发送到stdout:

curl --trace-ascii - {URL}

如果您使用的是libcurl,则为CURLOPT_DEBUGFUNCTION

这向您显示curl发送和接收的所有内容,并附带一些额外的信息。


1
这非常冗长,但是可以肯定地向您显示了您需要了解的所有内容。
2015年

26

我在这里尝试了答案,发现最有用和最简单的答案尚未列出,但它是:

curl -v https://example.com/path

这将打印出REQUEST标头以及RESPONSE标头以及其他有用的信息,例如SSL证书以及是否重用了现有的TCP连接。该-v标志可以与其他标志结合使用,例如跟随重定向并提示进行HTTP身份验证:

curl -vL --user my_username https://example.com/path

希望这可以帮助。


2
它被列在最高位置
Pmpr

19

类似于以下命令的命令将显示三个部分:请求标头,响应标头和数据(由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/< // -删除'<'前缀

11

我知道这有点晚了,但是我最喜欢的方法是netcat,因为您确切地得到了curl发送的信息。这可能与--trace--trace-ascii选项不同,后者不会正确显示非ASCII字符(它们仅显示为点或需要解码)。

您可以通过打开第一种类型的两个终端窗口来轻松完成此操作:

nc -l localhost 12345

这将在本地计算机的端口12345上打开一个侦听进程。

在第二个终端窗口中,输入curl命令,例如:

curl --form 'foo=bar' localhost:12345

在第一个终端窗口中,您将确切看到请求中发送的卷曲。

现在当然nc不会发送任何响应(除非您自己输入),因此您将需要中断curl命令(control-c)并为每个测试重复该过程。

但是,这是一个有用的选项,用于简单地调试您的请求,因为您不会在任何地方涉及往返,也不会在某个地方产生虚假的迭代请求,直到您正确为止。对命令满意后,只需将其重定向到有效的URL,就可以了。

您也可以对任何cURL库执行相同的操作,只需编辑您的请求以指向本地nc侦听器,直到对它满意为止。


6

将标头转储到一个文件中,将响应的有效负载转储到另一个文件中

curl -k -v -u user:pass  "url" --trace-ascii headers.txt >> response.txt

5
curl -s -v -o / dev / null -H“ Testheader:test” http://www.example.com

-I如果要发送HEAD请求而不是GET请求,也可以使用option。


3

这是我的php中的http客户端,用于使用cookie进行发布查询:

function http_login_client($url, $params = "", $cookies_send = "" ){

    // Vars
    $cookies = array();
    $headers = getallheaders();

    // Perform a http post request to $ur1 using $params
    $ch = curl_init($url);
    $options = array(   CURLOPT_POST => 1,
                        CURLINFO_HEADER_OUT => true,
                        CURLOPT_POSTFIELDS => $params,
                        CURLOPT_RETURNTRANSFER => 1,
                        CURLOPT_HEADER => 1,
                        CURLOPT_COOKIE => $cookies_send,
                        CURLOPT_USERAGENT => $headers['User-Agent']
                    );

    curl_setopt_array($ch, $options);

    $response = curl_exec($ch);

///调试信息echo $ response; var_dump(curl_getinfo($ ch)); ///

    // Parse response and read cookies
    preg_match_all('/^Set-Cookie: (.*?)=(.*?);/m', $response, $matches);

    // Build an array with cookies
    foreach( $matches[1] as $index => $cookie )
        $cookies[$cookie] = $matches[2][$index];

    return $cookies;
} // end http_login_client

3

您可以使用查看它 -iv

$> curl  -ivH "apikey:ad9ff3d36888957" --form  "file=@/home/mar/workspace/images/8.jpg" --form "language=eng" --form "isOverlayRequired=true" https://api.ocr.space/Parse/Image

1

您可以使用wiresharktcpdump查看任何网络流量(http也是如此)。


11
如果有效载荷是通过HTTPS进行的,那么在没有代理或应用程序层监视器的情况下,这些无效。
p00ya

1

https://http-tools.appspot.com/reflect-http-request/some-unique-id发出示例请求,并通过其相应的查找器URL https查看此请求包含的内容(请求标头,请求正文,请求参数)://http-tools.appspot.com/reflect-http-request-finder/some-unique-id。您可以使用任何字符串代替some-unique-id,请访问https://http-tools.appspot.com了解更多详细信息。


1
谢谢,虽然不能完全回答问题,但这正是我所需要的。设备A发出请求,设备B检查已发出请求。
domen,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.