J'essaie de déboguer une demande curl vers un point de terminaison 'getToken' du service Web.
Je ne suis pas sûr à 100% que l'URL et les informations d'authentification soient correctement écrites dans le descripteur Curl.
J'essaie d'utiliser curl_getinfo($ch, CURLINFO_HEADER_OUT);
pour capturer la demande envoyée, mais cela ne me donne pas beaucoup d'informations. Existe-t-il un moyen d’obtenir des diagnostics plus détaillés sur l’apparence de la demande curl?
Voici le code:
$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";
Tout cela fonctionne dans la mesure du possible, mais renvoie 401 à chaque fois - l'administrateur de l'API m'assure que le nom d'utilisateur/mot de passe que j'ai est correct.
Je me demandais si la valeur de l'URL était incorrecte ou si je ne transmettais pas le bon nom d'utilisateur/mot de passe, mais cette information n'est pas imprimée dans les données de la demande sauvegardées:
HEAD /export/auth HTTP/1.1
Authorization: Basic Y2FpcmRzdW5mYTpENWlAaVM4cw==
Host: webservices.mycompany.com
Accept: */*
Vous pouvez voir que le nom d'utilisateur/pass n'est pas enregistré (je suppose pour la sécurité). Je pense que l'URL du point de terminaison est la valeur Host
plus le début de la valeur HEAD
, donc webservices.mycompany.com/export/auth
?
L'instruction "Informations détaillées" n'imprime rien. Je ne sais pas pourquoi sur ça non plus!
Merci pour l'aide.
EDIT: ajout du mode verbose de Php - Debugging Curl merci à commenter immulatin
Si vous définissez CURLINFO_HEADER_OUT
sur true
, les en-têtes sortants sont disponibles dans le tableau renvoyé par curl_getinfo()
, sous la clé 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']);
Cela va imprimer:
GET /bar HTTP/1.1
Authorization: Basic c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk
Host: foo.com
Accept: */*
Notez que les informations d'authentification sont encodées en base64:
echo base64_decode('c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk');
// prints: someusername:secretpassword
Notez également que le nom d'utilisateur et le mot de passe doivent être codés en pourcentage pour échapper à tous les caractères réservés aux URL (/
, ?
, &
, :
et ainsi de suite) qu'ils pourraient contenir:
curl_setopt($ch, CURLOPT_USERPWD, urlencode($username).':'.urlencode($password));
Vous pouvez également utiliser un outil proxy tel que Charles pour capturer les en-têtes de demande sortante, les données, etc. en transmettant les détails du proxy via CURLOPT_PROXY
à votre méthode curl_setopt_array
.
Par exemple:
$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()
doit être ajouté avant la fermeture du gestionnaire de 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']);
La demande est imprimée dans un fichier request.txt avec des détails.
$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);
Vous pouvez également utiliser la fonction curl_getinfo ().