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

时间:2013-06-13 16:47:54

标签: php web-services curl

我正在尝试将curl请求调试到webservice'getToken'端点。

我并非100%确信网址和身份验证信息正确地写入了卷曲句柄。

我正在尝试使用curl_getinfo($ch, CURLINFO_HEADER_OUT);来捕获已发送的请求,但它并没有给我太多信息。有没有办法更深入地了解实际的卷曲请求是什么样的?

以下是代码:

$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";

这一切都可行,但每次都返回401-- API管理员向我保证我的用户名/密码是正确的。

我想知道我是否以某种方式错误地获取了URL值,或者没有发送正确的用户名/密码,但是这些信息没有打印在保存的请求数据中:

HEAD /export/auth HTTP/1.1
Authorization: Basic Y2FpcmRzdW5mYTpENWlAaVM4cw==
Host: webservices.mycompany.com
Accept: */*

您可以看到未记录用户名/通行证(我假设为安全起见)。我认为端点网址是host值加上HEAD值的开头,所以webservices.mycompany.com/export/auth

“详细信息”声明不打印任何内容。不知道为什么会这样!

感谢您的帮助。

编辑:感谢评论者immulatin

,从Php - Debugging Curl添加了详细模式

4 个答案:

答案 0 :(得分:63)

如果您将CURLINFO_HEADER_OUT设置为true,则curl_getinfo()键下request_header返回的数组中可以使用传出标题:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://foo.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']);

这将打印:

GET /bar HTTP/1.1
Authorization: Basic c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk
Host: foo.com
Accept: */*

请注意,auth详细信息是base64编码的:

echo base64_decode('c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk');
// prints: someusername:secretpassword

另请注意,用户名和密码需要进行百分比编码以转义任何网址保留字符(/?&:等等)可能包含:

curl_setopt($ch, CURLOPT_USERPWD, urlencode($username).':'.urlencode($password));

答案 1 :(得分:3)

您还可以使用代理工具(例如Charles)通过将代理详细信息通过CURLOPT_PROXY传递到curl_setopt_array方法来捕获传出请求标头,数据等。

例如:

$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);

答案 2 :(得分:1)

在关闭curl处理程序

之前必须添加

curl_getinfo()

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://foo.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);
$info = curl_getinfo($ch);
curl_exec($ch);
print_r($info['request_header']);

答案 3 :(得分:0)

请求以 request.txt 打印,详细信息为

$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);

您还可以使用curl_getinfo()函数。