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

use*_*289 45 php curl web-services

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

我并不是100%确信URL和身份验证信息正确地写入了卷曲句柄.

我正在尝试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";
Run Code Online (Sandbox Code Playgroud)

这一切都可以正常工作,但每次都返回401-- API管理员向我保证我的用户名/通行证是正确的.

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

HEAD /export/auth HTTP/1.1
Authorization: Basic Y2FpcmRzdW5mYTpENWlAaVM4cw==
Host: webservices.mycompany.com
Accept: */*
Run Code Online (Sandbox Code Playgroud)

你可以看到没有记录用户名/密码(我假设是为了安全).我认为端点URL是host值加上值的开头HEAD,所以webservices.mycompany.com/export/auth

"详细信息"声明不打印任何内容.不知道为什么要这么做!

感谢帮助.

编辑:从Php添加详细模式- 调试卷曲感谢评论者immulatin

laf*_*for 70

如果设置CURLINFO_HEADER_OUTtrue,则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']);
Run Code Online (Sandbox Code Playgroud)

这将打印:

GET /bar HTTP/1.1
Authorization: Basic c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk
Host: foo.com
Accept: */*
Run Code Online (Sandbox Code Playgroud)

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

echo base64_decode('c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk');
// prints: someusername:secretpassword
Run Code Online (Sandbox Code Playgroud)

另外请注意,用户名和密码必须是百分比编码逃避任何URL保留字符(/,?,&,:等等),它们可能包含:

curl_setopt($ch, CURLOPT_USERPWD, urlencode($username).':'.urlencode($password));
Run Code Online (Sandbox Code Playgroud)


小智 6

curl_getinfo()必须在关闭curl处理程序之前添加

$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);
Run Code Online (Sandbox Code Playgroud)

  • `curl_getinfo()` 必须在 `curl_exec()` 之后使用,所以你的代码是错误的! (5认同)