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

Posted

技术标签:

【中文标题】向服务器发送请求时,如何查看 curl 生成的请求标头?【英文标题】:How can I see the request headers made by curl when sending a request to the server? 【发布时间】:2010-10-26 09:37:12 【问题描述】:

当我向服务器发送请求时,我想查看curl 生成的请求标头。我该如何检查?

【问题讨论】:

这个网址可能会有所帮助。 helloacm.com/curl 你可以用这个来测试run-node.com/now-use-curl-with-http-echo-com 【参考方案1】:

您可以使用“-”作为文件名将标头直接转储到标准输出 - 例如查看标头和内容,并遵循重定向,所有这些都在一个输出中:

curl -L -D - -s [url]

【讨论】:

这是在之前的答案中,但由于它位于长答案的底部,我赞成,因为它很有用【参考方案2】:

curl --trace-ascii filename 或使用单个破折号代替文件名将其发送到标准输出:

curl --trace-ascii - URL

CURLOPT_DEBUGFUNCTION 如果你使用的是 libcurl

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

【讨论】:

这很冗长,但肯定会向您展示您应该知道的一切。 这是唯一对我有帮助的答案。一些外部脚本正在设置一些代理设置,这告诉我代理在不应该使用的时候被使用。详细输出未提及代理。【参考方案3】:

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

$ curl -v -I -H "Testing: Test header so you see this works" http://***.com/
* About to connect() to ***.com port 80 (#0)
*   Trying 69.59.196.211... connected
* Connected to ***.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: ***.com
> Accept: */*
> Testing: Test header so you see this works
>
< HTTP/1.0 200 OK
...

【讨论】:

curl -v -D - ***.com -o /dev/null (为了不显示整个网站的内容,只显示标题) curl -Ivs http://example.com &gt; /dev/null : -I 用于 HEAD 请求,-v 显示发送的标题,-s 隐藏进度条,&gt; /dev/null 仅显示 -v 输出,避免重复。 @PiotrekDe -D - 很简洁,但对我来说没有用,因为它只是复制了 -v 已经显示的标题。如果您希望它们不加前缀以供自动化机器使用,那么在这种情况下可能会更好,但我只想更详细地了解问题所在。 verbose标志有两个非常有用的特性:第一,它还打印通过HTTPS访问网站时的TLS握手过程,例如curl -v https://www.example.com;其次,如果您通过HTTP proxy访问该站点,它还会打印CONNECT请求,例如curl --proxy my-proxy:8080 http://www.example.com。我相信如果在这个答案中提到这两个功能的一些例子,它会帮助更多的用户。 TL;DR:不要使用-I 在现代世界中,当人们询问是否看到标头时,他们可能是在谈论 API。如果您使用“我使用-I 来查看带有我的Apache 网络服务器的标题”的心态,那么当您可能打算使用GET 时,您将浪费大量时间针对HEAD 方法进行开发。不要再告诉人们使用-I。如果他们想要HEAD,请使用-X HEAD (TWSS)【参考方案4】:

像下面这样的命令将显示三个部分:请求标头、响应标头和数据(由 CRLF 分隔)。它避免了 curl 添加的技术信息和语法噪音。

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

该命令将产生以下输出:

GET / HTTP/1.1
Host: www.***.com
User-Agent: curl/7.54.0
Accept: */*

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://***.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=.***.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://***.com/">here</a></body>

说明:

-vs - 添加标题 (-v) 但删除进度条 (-s) 2&gt;&amp;1 - 将标准输出和标准错误合并成一个标准输出 sed - 使用以下命令编辑 curl 生成的响应 /^* /d - 删除以“*”开头的行(技术信息) /bytes data]$/d - 删除以 'bytes data]' 结尾的行(技术信息) s/&gt; // - 删除 '> ' 前缀 s/&lt; // - 删除 '

【讨论】:

【参考方案5】:

curl 的 --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 响应,准确地说是不相关的)。


如果您只想保存 response 标头,请使用 --dump-header 选项:

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

如果您需要有关可用选项的更多信息,请使用curl --help | less(它会产生几百行输出,但会提到很多选项)。或者找到manual page,那里有更多关于选项含义的解释。

【讨论】:

-D 为您提供 response 标头(与 -I 一样,但为 STDIN)。该问题要求 request 标头。【参考方案6】:

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

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

nc -l localhost 12345

这会在本地机器的 12345 端口上打开一个监听进程。

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

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

在第一个终端窗口中,您将确切地看到 curl 在请求中发送的内容。

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

但是,对于简单地调试您的请求来说,这是一个有用的选项,因为您不会在任何地方进行往返,也不会在某处产生虚假的迭代请求,直到您做对为止;一旦您对命令感到满意,只需将其重定向到有效的 URL 即可。

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

【讨论】:

点赞。这是完全自信地查看 curl 发送的内容的最简洁方式。大多数人回答了curl -v 的一些变化,这基本上可以工作,但也会产生大量其他噪音,尤其是对于 HTTPS。 我完全同意@Yitz。如果您只对 curl 发送的内容感兴趣(而不关心网络细节),这是最好的选择。【参考方案7】:

问题没有说明是指名为 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() 中的所有内容,以及有关请求和响应的更多详细信息。 您可以使用 CURLOPT_WRITEHEADER 获取标头信息,使用 CURLOPT_FILE 获取整个传输 请记住,如果连接被拒绝,使用 CURLOPT_WRITEHEADER CURLOPT_FILE 指定的文件为空。 谁说过使用php? 我赞成您的回答,因为虽然问题与 php 无关,但您基于 php 的回答为我指明了解决我自己发送不记名令牌问题的正确方向。谢谢你。我在这里陈述我的理由只是徒劳地试图让这个问题出现在未来谷歌搜索具有类似问题的 php 开发人员中。【参考方案8】:

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

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

【讨论】:

【参考方案9】:

您可以使用-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

【讨论】:

【参考方案10】:

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

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

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

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

希望这会有所帮助。

【讨论】:

列在最上面【参考方案11】:

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

【讨论】:

谢谢,虽然没有完全回答这个问题,但这正是我所需要的。设备 A 发出请求,设备 B 检查是否已发出请求。【参考方案12】:
curl -s -v -o/dev/null -H "Testheader: test" http://www.example.com

如果您想发送 HEAD 请求而不是 GET 请求,也可以使用 -I 选项。

【讨论】:

【参考方案13】:

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

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));

【讨论】:

对我来说这似乎是响应标头而不是传出标头。 var_dump $data 将返回响应标头以及响应正文。 var_dump curl_getinfo($ch) 将为您提供请求标头。 CURLOPT_HEADER 是响应头 - CURLINFO_HEADER_OUT 是请求头。这就是 OP 所要求的 :)【参考方案14】:

这是我在 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);

/// 调试信息 回声$响应; 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

【讨论】:

【参考方案15】:

您可以使用wireshark 或tcpdump 查看任何网络流量(也可以使用http)。

【讨论】:

如果负载通过 HTTPS,那么如果没有代理或应用层监视器,这些都是无用的。

以上是关于向服务器发送请求时,如何查看 curl 生成的请求标头?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 PHP 发送带有 pem 证书的 curl 请求?

PHP cURL无法向api发送POST请求

PHP通过curl向其它服务器发请求并返回数据

iOS https请求对自签名证书忽略

怎么用CURL向HTTPS发送请求并且获取返回值

使用来自文件的发布数据向 cURL 发送请求