如何获取已发送PHP curl请求的信息

如何获取已发送PHP curl请求的信息,php,web-services,curl,Php,Web Services,Curl,我正在尝试调试对webservice“getToken”端点的curl请求 我不能100%确信URL和身份验证信息是否正确地写入了curl句柄 我试图使用curl\u getinfo($ch,CURLINFO\u HEADER\u OUT)捕获发送的请求,但它没有给我多少信息。有没有办法对实际的curl请求进行更深入的诊断 代码如下: $ch = curl_init($url); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_s

我正在尝试调试对webservice“getToken”端点的curl请求

我不能100%确信URL和身份验证信息是否正确地写入了curl句柄

我试图使用
curl\u getinfo($ch,CURLINFO\u HEADER\u OUT)
捕获发送的请求,但它没有给我多少信息。有没有办法对实际的curl请求进行更深入的诊断

代码如下:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");       
curl_setopt($ch, CURLOPT_HEADER, 1); // just getting header to see if we got an auth token
curl_setopt($ch, CURLOPT_FILE, $fh);
curl_setopt($ch, CURLOPT_NOBODY, 1); 
curl_setopt($ch, CURLINFO_HEADER_OUT, 1); // capture the header info
curl_setopt($ch, CURLOPT_VERBOSE, 1); // turn verbose on    
// execute the curl request 

$rh = fopen("request.txt", "w"); // open request file handle
$verbose = fopen('php://temp', 'rw+');
curl_setopt($ch, CURLOPT_STDERR, $verbose);

curl_exec($ch); // execute request

$sent_request = curl_getinfo($ch, CURLINFO_HEADER_OUT);
fwrite($rh, $sent_request); // save the request info
fclose($rh);
!rewind($verbose);
$verboseLog = stream_get_contents($verbose);

echo "Verbose information:\n<pre>", htmlspecialchars($verboseLog), "</pre>\n";
您可以看到用户名/通行证没有被记录(我假设是为了安全)。我认为端点URL是
host
值加上
HEAD
值的开头,所以
webservices.mycompany.com/export/auth

“详细信息”语句不打印任何内容。也不知道为什么会这样

谢谢你的帮助


编辑:通过commenter immulatin添加了详细模式。如果将
CURLINFO\u HEADER\u OUT
设置为
true
,则在
curl\u getinfo()
返回的数组中,在
请求\u HEADER
键下,传出标头可用:

GET /bar HTTP/1.1
Authorization: Basic c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk
Host: foo.com
Accept: */*
这将打印:

echo base64_decode('c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk');
// prints: someusername:secretpassword
注意:身份验证详细信息是base64编码的:

curl_setopt($ch, CURLOPT_USERPWD, urlencode($username).':'.urlencode($password));
还请注意,用户名和密码需要进行百分比编码,以转义任何URL保留字符(
/
&
等等),它们可能包含:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/bar");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "someusername:secretpassword");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_exec($ch);
$info = curl_getinfo($ch);
print_r($info['request_header']);
curl_close($ch);
必须在关闭curl处理程序之前添加
curl\u getinfo()

$proxy = '127.0.0.1:8888';
$opt = array (
    CURLOPT_URL => "http://www.example.com",
    CURLOPT_PROXY => $proxy,
    CURLOPT_POST => true,
    CURLOPT_VERBOSE => true,
    );

$ch = curl_init();
curl_setopt_array($ch, $opt);
curl_exec($ch);
curl_close($ch);

您还可以使用代理工具,如通过
CURLOPT\u proxy
将代理详细信息传递给
curl\u setopt\u数组
方法来捕获传出的请求头、数据等

例如:

$ch = curl_init();
$f = fopen('request.txt', 'w');
curl_setopt_array($ch, array(
CURLOPT_URL            => $url, 
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_VERBOSE        => 1,
CURLOPT_STDERR         => $f,
));
$response = curl_exec($ch);
fclose($f);
curl_close($ch);

请求打印在request.txt中,包含详细信息


还可以使用curl_getinfo()函数

您可以将verbose设置为true:我要检查的第一件事是,我会用最少的参数发出一个简单得多的请求,并手动键入所有变量值(url、登录名、密码)。像那样的有线错误通常是由格式错误的输入引起的,例如额外的空格等。我认为这篇旧文章可能很有用,
curl\u getinfo()
必须在
curl\u exec()
之后使用,所以你的代码是错误的!
$proxy = '127.0.0.1:8888';
$opt = array (
    CURLOPT_URL => "http://www.example.com",
    CURLOPT_PROXY => $proxy,
    CURLOPT_POST => true,
    CURLOPT_VERBOSE => true,
    );

$ch = curl_init();
curl_setopt_array($ch, $opt);
curl_exec($ch);
curl_close($ch);
$ch = curl_init();
$f = fopen('request.txt', 'w');
curl_setopt_array($ch, array(
CURLOPT_URL            => $url, 
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_VERBOSE        => 1,
CURLOPT_STDERR         => $f,
));
$response = curl_exec($ch);
fclose($f);
curl_close($ch);