Подтвердить что ты не робот

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

Я пытаюсь отлаживать запрос на завивки к конечной точке web-сервиса "getToken".

Я не уверен на 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 - отладочный завиток благодаря комментарию immulatin

4b9b3361

Ответ 1

Если вы установите 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));

Ответ 2

Вы также можете использовать прокси-инструмент, например 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);

Ответ 3

curl_getinfo() должен быть добавлен перед закрытием обработчика curl

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

Ответ 4

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