Problème d'utilisation de cURL avec la méthode POST

RedHad87
Invité n'ayant pas de compte PHPfrance

20 juin 2016, 16:08

Bonjour,

J'ai utilisé cURL avec la méthode GET pour envoyer un fichier de configuration sous forme de fichier XML vers ma gateway de VoIP avec le code suivant:
<?php
// Url cible
$url="http://192.168.15.1/admin/resync?http//192.168.15.200/config.xml&xuser=admin&xpassword=admin";
// Le tableau associatif contenant les variables envoyées par POST au serveur
$options=array(
      CURLOPT_URL            => $url, // Url cible
      CURLOPT_RETURNTRANSFER => true, // Retourner le contenu téléchargé dans une chaine
      CURLOPT_HEADER         => false, // Ne pas inclure l'entête de réponse du serveur dans la chaine retournée
      CURLOPT_FAILONERROR    => true // Gestion des codes d'erreur HTTP supérieurs ou égaux à 400
);
// Création d'un nouvelle ressource cURL
$CURL=curl_init();
// Erreur suffisante pour justifier un die()
if(empty($CURL)){die("ERREUR curl_init : Il semble que cURL ne soit pas disponible.")}
      // Configuration des options de téléchargement
      curl_setopt_array($CURL,$options);
      // Exécution de la requête
      $content=curl_exec($CURL); // Le contenu téléchargé est enregistré dans la variable $content
      // Si il s'est produit une erreur lors du téléchargement
      if(curl_errno($CURL)){
            // Le message d'erreur correspondant est affiché
            echo "ERREUR curl_exec : ".curl_error($CURL);
      }
// Fermeture de la session cURL
curl_close($CURL);
?>
192.168.15.1 -> @ip de la gateway

192.168.15.200 -> @ip de mon serveur web

Le script fonctionne bien, mais je voudrai utiliser cURL avec la méthode POST en ajoutant les deux options "CURLOPT_POST" et "CURLOPT_POSTFIELDS " avec le code suivant:
<?php
// Url cible
$url="http://192.168.15.1/admin/resync?http//192.168.15.200/config.xml";
// Complétez le tableau associatif $postFields avec les variables qui seront envoyées par POST au serveur
$postFields=array(
      "xuser"     => "admin",  // La variable xuser contenant la valeur admin
      "xpassword" => "admin"  // La variable xpassword contenant la valeur admin
);
// Le tableau associatif contenant les variables envoyées par POST au serveur
$options=array(
      CURLOPT_URL            => $url, // Url cible
      CURLOPT_RETURNTRANSFER => true, // Retourner le contenu téléchargé dans une chaine
      CURLOPT_HEADER         => false, // Ne pas inclure l'entête de réponse du serveur dans la chaine retournée
      CURLOPT_FAILONERROR    => true, // Gestion des codes d'erreur HTTP supérieurs ou égaux à 400
      CURLOPT_POST           => true, // Effectuer une requête de type POST
      CURLOPT_POSTFIELDS     => $postFields // Le tableau associatif contenant les variables envoyées par POST au serveur
);
// Création d'un nouvelle ressource cURL
$CURL=curl_init();
// Erreur suffisante pour justifier un die()
if(empty($CURL)){die("ERREUR curl_init : Il semble que cURL ne soit pas disponible.")}
      // Configuration des options de téléchargement
      curl_setopt_array($CURL,$options);
      // Exécution de la requête
      $content=curl_exec($CURL); // Le contenu téléchargé est enregistré dans la variable $content
      // Si il s'est produit une erreur lors du téléchargement
      if(curl_errno($CURL)){
            // Le message d'erreur correspondant est affiché
            echo "ERREUR curl_exec : ".curl_error($CURL);
      }
// Fermeture de la session cURL
curl_close($CURL);
?>
Mais cela ne marche pas.

Merci.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

20 juin 2016, 16:15

Bonjour,

Sans savoir précsiément ce que ton serveur cible attend ni comment il fonctionne, c'est difficile de savoir pour nous pourquoi il ne fait pas ce que tu lui demandes.

Mon conseil : installe wireshark sur ton serveur web et vérifie que la requête envoyée en POST est bien la même que celle attendue.
https://www.wireshark.org
Ça te permettra aussi de voir facilement quelle est la réponse du serveur.
Quand tout le reste a échoué, lisez le mode d'emploi...

RedHad87
Invité n'ayant pas de compte PHPfrance

20 juin 2016, 16:36

Bonjour,

Merci pour votre réponse, je vais essayer cela dès que je rentre.

Par-contre, je voudrais savoir si la deuxième requête HTTP (http://192.168.15.200/config.xml) doit être dans URL ou bien avec les variable dans $postFields, car elle se situe entre le "?" et le "&", mais la variable doit avoir un nom et une valeur.

Merci.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

20 juin 2016, 17:16

Aucune idée, ça dépend de ce que ton serveur en face attend...
Quand tout le reste a échoué, lisez le mode d'emploi...