我希望curl
在向服务器发送请求时看到请求标头.我该怎么检查?
我认为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 ...
问题没有指定命名行命令是命名curl
还是整个cURL库.
以下使用cURL库的PHP代码使用第一个参数作为HTTP方法(例如"GET","POST","OPTIONS"),第二个参数作为URL.
$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卷曲)的唯一方法是使用以下选项:
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));
的--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}或使用单个破折号而不是文件名将其发送到stdout:
curl --trace-ascii - {URL}
CURLOPT_DEBUGFUNCTION如果您正在使用libcurl
这会向您显示curl发送和接收的所有内容,并提供一些额外的信息.
我在这里尝试了答案,发现最有用和最简单的答案还没有作为答案列出,但它是:
curl -v https://example.com/path
这将打印出REQUEST标头以及RESPONSE标头以及其他有用的信息,例如SSL证书以及是否重用了现有的TCP连接.-v
当然,该标志可以与其他标志组合,例如遵循重定向并提示进行HTTP身份验证:
curl -vL --user my_username https://example.com/path
希望这可以帮助.
类似于以下命令的命令将显示三个部分:请求标头,响应标头和数据(由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=/; HttpOnlyDocument Moved Object Moved
This document may be found here
描述:
-vs
-添加标题(-v)但删除进度栏(-s)
2>&1
-将stdout和stderr合并为单个stdout
sed
-使用以下命令编辑curl产生的响应
/^* /d
-删除以“ *”开头的行(技术信息)
/bytes data]$/d
-删除以“字节数据]”结尾的行(技术信息)
s/> //
-删除'>'前缀
s/< //
-删除'<'前缀
我知道这有点晚了,但我最喜欢这样做的方法是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
侦听器,直到您对它感到满意为止.
将标头转储到一个文件中,并将响应的有效负载转储到另一个文件中
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
-I
如果要发送HEAD请求而不是GET请求,也可以使用选项.