我希望在向服务器发送请求时看到curl
发出的请求标头。我怎么检查呢?
答案 0 :(得分:459)
我认为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
...
答案 1 :(得分:134)
问题没有指明是否有名为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
答案 2 :(得分:47)
我设法看到我的传出标题(用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));
答案 3 :(得分:39)
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响应,准确但无关紧要),已被记录。
如果您只想保存响应标头,请使用--dump-header
选项:
curl -D file url
curl --dump-header file url
如果您需要有关可用选项的更多信息,请使用curl --help | less
(它会产生几百行输出,但会提到很多选项)。或者找到manual page,其中有更多解释选项的含义。
答案 4 :(得分:30)
curl --trace-ascii {filename}或使用单个破折号而不是文件名将其发送到stdout:
curl --trace-ascii - {URL}
CURLOPT_DEBUGFUNCTION如果您使用的是libcurl
这会向您显示所有 curl发送和接收的内容,并提供一些额外的信息。
答案 5 :(得分:27)
我在这里尝试了答案,发现最有用也最简单的答案尚未列为答案,但它是:
curl -v https://example.com/path
这将打印出 REQUEST 标头以及 RESPONSE 标头以及其他有用的标头,例如SSL证书以及是否重用了现有的TCP连接。当然,-v
标志可以与其他标志组合,例如跟随重定向并提示进行HTTP身份验证:
curl -vL --user my_username https://example.com/path
希望这有帮助。
答案 6 :(得分:8)
我知道这有点晚了,但我最喜欢的方法是netcat
,因为你得到curl
发送的内容;这可能与--trace
或--trace-ascii
选项不同,后者不会正确显示非ASCII字符(它们只显示为点或需要解码)。
您可以通过打开第一个类型的两个终端窗口来轻松完成此操作:
nc -l localhost 12345
这将在本地计算机的端口12345上打开侦听过程。
在第二个终端窗口中输入curl命令,例如:
curl --form 'foo=bar' localhost:12345
在第一个终端窗口中,您会看到完全请求中发送的卷曲。
现在当然nc
不会发送任何响应(除非你自己输入),所以你需要中断curl命令(control-c)并重复每个测试的过程。 / p>
然而,这对于简单地调试您的请求是一个有用的选项,因为您不会在任何地方进行往返,或者在某个地方产生虚假的迭代请求,直到您做对了;一旦你对命令感到满意,只需将其重定向到一个有效的URL,你就可以了。
您也可以对任何cURL库执行相同操作,只需编辑您的请求以指向本地nc
侦听器,直到您对它感到满意为止。
答案 7 :(得分:6)
将标头转储到一个文件中,并将响应的有效负载转储到另一个文件中
curl -k -v -u user:pass "url" --trace-ascii headers.txt >> response.txt
答案 8 :(得分:6)
类似于以下命令的命令将显示三个部分:请求标头,响应标头和数据(由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/< //
-删除'<'前缀答案 9 :(得分:5)
curl -s -v -o/dev/null -H "Testheader: test" http://www.example.com
如果您想发送HEAD请求而不是GET请求,也可以使用-I
选项。
答案 10 :(得分: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);
/// DEBUG信息 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
答案 11 :(得分: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
答案 12 :(得分:1)
答案 13 :(得分:1)
向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。