当向服务器发送请求时,我如何才能看到curl所做的请求头?

当我向服务器发送请求时,我想看到curl所做的请求头。我要怎么检查呢?

583843 次浏览

--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(它产生几百行输出,但提到了很多选项)。或者找到手册页,其中有更多关于选项含义的解释。

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

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTION如果你使用libcurl

这显示了一切 curl发送和接收,并附带了一些额外的信息。

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

唯一的方法,我设法看到我的外向头(卷曲与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));

我认为curl --verbose/-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
...

下面是我的http客户端在php使post查询包含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 $响应; var_dump (curl_getinfo (ch)美元); / / / < / p >

    // 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

这个问题没有指定命令行命令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 -k -v -u user:pass  "url" --trace-ascii headers.txt >> response.txt
curl -s -v -o/dev/null -H "Testheader: test" http://www.example.com

You could also use -I option if you want to send a HEAD request and not a GET request.

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了解更多细节。

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

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

这将打印出请求报头和响应报头以及其他有用的信息,如SSL证书以及是否重用了现有的TCP连接。当然,-v标志可以与其他标志结合使用,例如重定向和HTTP认证提示:

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

希望这能有所帮助。

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

我知道这有点晚了,但我最喜欢的方法是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侦听器,直到您满意为止。

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

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 -删除以“bytes data”结尾的行(技术信息)
  • s/> // -删除'> '前缀
  • s/< // -删除'<的前缀

您可以使用"-"作为文件名-例如,查看标题和内容,并遵循重定向,所有在一个输出:

curl -L -D - -s [url]