Как получить информацию о отправленном запросе PHP curl

Я пытаюсь отлаживать запрос curl на конечную точку getToken webservice.

Я не уверен на 100%, что URL-адрес и информация об авторизации автоматически записываются в ручку curl.

Я пытаюсь использовать 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: */* 

Вы можете видеть, что имя пользователя / пропуск не записано (я предполагаю для обеспечения). Конечный URL-адрес, который, я думаю, является значением host плюс начало значения HEAD , поэтому webservices.mycompany.com/export/auth ?

В заявлении «Расширенная информация» ничего не отображается. Не знаю, почему и на этом!

Спасибо за помощь.

EDIT: добавлен подробный режим из Php – отладка Curl благодаря комментатору immulatin

Если для параметра CURLINFO_HEADER_OUT установлено 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: */* 

Обратите внимание, что данные аутентификации основаны на base64:

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

Также обратите внимание, что имя пользователя и пароль должны быть закодированы в процентах, чтобы избежать любых зарезервированных символов URL ( / , ? , & : И т. Д.), Которые могут содержать:

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

Вы также можете использовать прокси-инструмент, например Charles, для захвата заголовков исходящих запросов, данных и т. Д., CURLOPT_PROXY данные прокси через 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); 

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']); 

Запрос печатается в файле 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 ().