Paramètres POST pour PHP Curl
- 19/02/2014
PHP://
Paramètres POST pour PHP CurlPour mémoire, parce que j'ai perdu du temps dessus, et éventuellement aider quelqu'un d'autre, je note une légère différences dans le passage des paramètres à envoyer en POST via PHP Curl.
Ceci fonctionne avec un site existant (l'excellent surveillant de site web Woozweb).
<?php
$sPostParams = sprintf('login_email=%s&login_password=%s', urlencode($sLogin), urlencode($sMdp));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $sPostParams);
alors que ceci ne marche pas :
<?php
$aPostParams = array('login_email'=>$sLogin, 'login_password'=>$sMdp);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $aPostParams);
Le comportement est que les cookies n'étaient jamais renvoyés, donc que ma session ne marchait pas (pourtant, je recevais bien une redirection vers la page "connectée" en validant le formulaire de connexion). Très perturbant.
La seule explication trouvée dans la doc PHP ou sur le net en général est la suivante :Si le paramètre value est un tableau, l'en-tête Content-Type sera définie à multipart/form-data.
et visiblement cela compte pour certains sites.
Deux points qui m'ont aidé à avancer :- curl_setopt($ch, CURLOPT_HEADER, true) : permet de voir les en-têtes envoyés par le serveur directement dans la sortie du curl_exec(), très pratique.
- Utiliser curl_setopt($ch, CURLOPT_COOKIEJAR, $sFichierCookies); et fermer la session curl pour avoir le contenu des cookies dans le fichier.
Rubriques des billets
- Agilité (22)
- Archerie (10)
- Avis (74)
- Cultures (22)
- Délires (44)
- Démocrachie (11)
- Développement (59)
- Développement web (36)
- Ergonomie (20)
- Geekerie (12)
- Inclassable (6)
- Informatique (27)
- Japon (9)
- Littératures (39)
- PHP (12)
- Poor Lonesome Coder (31)
- Régalons-nous (6)
- Sortons! (3)
- Travail (20)
- Vivre mieux (40)
- Voyages (4)
- Webmasteriat (20)
Commentaires(s)
- 2014-02-19 12:55:18 - hugo
hi, copier / coller foireux pour ton second exemple non fonctionnel... Tu n'as pas remplacé sprintf par array
- 2014-02-19 15:58:15 - Cédric
Merci Hugo, bien vu, et corrigé maintenant. C'était pour voir si un vrai dev lisait mon site ;-)
- 2014-02-21 14:27:30 - Philippe Gamache
Ouch...
Il existe une fonction PHP simple pour le faire : http_build_query
Comme le corps d'une requêtre POST en HTTP est du même format que l'appel dans le URI, l'utilisation de la même fonction est recommander.
$sPostParams = http_build_query(array('login_email'=>$sLogin, 'login_password'=>$sMdp);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $sPostParams);
Utiliser curl_setopt($ch, CURLOPT_COOKIEJAR, $sFichierCookies); pour la réception des témois.
Utiliser curl_setopt($ch, CURLOPT_COOKIEFILE, $sFichierCookies); pour l'envois de ses même témois.
- 2014-02-21 17:30:30 - Cédric
Bon conseil Philippe, vous avez raison, cela facilite la construction de la chaîne, et je ne la connaissais pas. Cela rend la "bonne version" plus simple à écrire.
Ecrire votre commentaire
07/03/2014 - Systeme