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

454 curl

我希望curl在向服务器发送请求时看到请求标头.我该怎么检查?

Ste*_*lla 481

我认为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
...
Run Code Online (Sandbox Code Playgroud)

  • curl -v -D - stackoverflow.com -o/dev/null(为了不显示整个站点的内容,只显示标题) (55认同)
  • `curl -Ivs http://example.com>/dev/null`:`-I`用于`HEAD`请求,`-v`用于显示已发送的标题,`-s`用于隐藏进度条,`>/dev/null`仅显示-v输出,避免重复. (18认同)
  • “verbose”标志有两个非常有用的功能:首先,它还会打印通过 HTTPS 访问网站时的 TLS 握手过程,例如 `curl -v https://www.example.com`;其次,如果您通过[HTTP代理](https://en.wikipedia.org/wiki/HTTP_tunnel#HTTP_CONNECT_method)访问站点,它还会打印`CONNECT`请求,例如`curl --proxy my-proxy: 8080 http://www.example.com`。我相信如果这个答案中提到这两个功能的一些例子,会对更多的用户有所帮助。 (2认同)
  • **TL;DR:不要使用`-I`** 在现代世界中,当人们询问是否看到标头时,他们可能是在谈论 API。如果你使用“我使用`-I`来查看我的Apache网络服务器的头文件”的心态,当你可能打算使用`GET`时,你将浪费大量时间针对`HEAD`方法进行开发。不要告诉人们使用`-I`。如果他们想要`HEAD`,使用`-X HEAD` (TWSS) (2认同)

Tas*_*iwa 138

问题没有指定命名行命令是命名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;
Run Code Online (Sandbox Code Playgroud)

用法示例:

php curl-test.php OPTIONS https://google.com
Run Code Online (Sandbox Code Playgroud)

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

curl -v -s -o - -X OPTIONS https://google.com
Run Code Online (Sandbox Code Playgroud)

  • 谁说过使用`php?` (32认同)
  • 您可以使用CURLOPT_WRITEHEADER作为标题信息,使用CURLOPT_FILE进行整个传输 (3认同)

Kni*_*lke 48

我设法看到我的传出标题(用curl卷曲)的唯一方法是使用以下选项:

curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
Run Code Online (Sandbox Code Playgroud)

获取调试信息:

$data = curl_exec($ch);
var_dump($data);
var_dump(curl_getinfo($ch));
Run Code Online (Sandbox Code Playgroud)

  • `var_dump $ data`将返回响应头以及响应主体.var_dump`curl_getinfo($ ch)`将为您提供请求标头. (3认同)
  • `CURLOPT_HEADER`是响应头 - `CURLINFO_HEADER_OUT`是请求头.这就是OP所要求的:) (2认同)

Jon*_*ler 41

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

例如,命令

curl --trace-ascii curl.trace http://www.google.com/ 
Run Code Online (Sandbox Code Playgroud)

生成一个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: 
Run Code Online (Sandbox Code Playgroud)

它还得到了一个响应(一个302响应,准确但无关紧要).


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

curl -D file url
curl --dump-header file url
Run Code Online (Sandbox Code Playgroud)

如果您需要有关可用选项的更多信息,请使用curl --help | less(它会产生几百行输出,但会提到很多选项).或者找到手册页,其中有更多解释选项的含义.

  • -D为您提供_response_标头(和-I一样,但是给STDIN).问题是_request_标题. (9认同)

Dan*_*erg 31

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

curl --trace-ascii - {URL}
Run Code Online (Sandbox Code Playgroud)

CURLOPT_DEBUGFUNCTION如果您正在使用libcurl

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

  • 这非常冗长,但确实向您展示了您应该知道的所有内容。 (2认同)

Gre*_*egT 27

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

curl -v https://example.com/path
Run Code Online (Sandbox Code Playgroud)

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

curl -vL --user my_username https://example.com/path
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 它列在最上面 (2认同)

igo*_*kin 11

类似于以下命令的命令将显示三个部分:请求标头,响应标头和数据(由CRLF分隔)。它避免了卷曲所带来的技术信息和语法噪音。

curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'
Run Code Online (Sandbox Code Playgroud)

该命令将产生以下输出:

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>
Run Code Online (Sandbox Code Playgroud)

描述:

  • -vs -添加标题(-v)但删除进度栏(-s)
  • 2>&1 -将stdout和stderr合并为单个stdout
  • sed -使用以下命令编辑curl产生的响应
  • /^* /d -删除以“ *”开头的行(技术信息)
  • /bytes data]$/d -删除以“字节数据]”结尾的行(技术信息)
  • s/> // -删除'>'前缀
  • s/< // -删除'<'前缀


Har*_*ikk 9

我知道这有点晚了,但我最喜欢这样做的方法是netcat,因为你得到的确是这样curl; 这可以从不同--trace--trace-ascii将无法正常显示非ASCII字符(他们只是显示为点或需要被解码)的选项.

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

nc -l localhost 12345
Run Code Online (Sandbox Code Playgroud)

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

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

curl --form 'foo=bar' localhost:12345
Run Code Online (Sandbox Code Playgroud)

在第一个终端窗口,你会看到究竟是什么在卷曲请求发送.

现在当然nc不会发送任何响应(除非你自己键入),所以你需要中断curl命令(control-c)并重复每个测试的过程.

但是,这是一个简单调试您的请求的有用选项,因为您不会在任何地方进行往返,或者在某个地方产生虚假的迭代请求,直到您做到正确为止; 一旦你对命令感到满意,只需将其重定向到一个有效的URL,你就可以了.

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

  • 对此点赞。这是完全自信地查看curl 发送的内容的最干净的方式。大多数人回答了“curl -v”的一些变体,它基本上可以工作,但也会转储大量其他噪音,尤其是对于 HTTPS。 (3认同)

小智 6

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

curl -k -v -u user:pass  "url" --trace-ascii headers.txt >> response.txt
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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