IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

fsockopen comment lire le resultat


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 12
    Par défaut fsockopen comment lire le resultat
    Bonjour,

    j'utilise le script proposé par un portail e-commerce bien connu pour automatiser la gestion des commandes avec mon propre Back office.

    le script envoi des données xml, le serveur traite l'information et retourne un message, lui aussi au format xml.

    Voici le script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    function do_post_https_request($url, $data, $referrer=null) {
    $result = '';
     
    // parsing the given URL
    $url_Info = parse_url($url);
     
    if(!isset($url_Info["port"])) {// If port is not specified in url, use standard (https=443)
    $url_Info["port"] = 443;
    }
     
    if($referrer) {// if null, use this script as referrer
    $referrer = $_SERVER["SCRIPT_URI"];
    }
     
    foreach((array)$data as $key=>$value) {
    $values[] = "$key=".urlencode($value);
    }
    $data_string = implode("&",$values);
     
     
    // building POST-request:
    $request .= "POST ".$url_Info["path"]." HTTP/1.1\n";
    $request .= "Host: ".$url_Info["host"]."\n";
    $request .= "Referer: $referer\n";
    $request .= "Content-type: application/x-www-form-urlencoded\n";
    $request .= "Content-length: ".strlen($data_string)."\n";
    $request .= "Connection: close\n";
    $request .= "\n";
    $request .= $data_string."\n";	
     
    if ($fp = fsockopen("ssl://" . $url_Info["host"], $url_Info["port"],$errno, $errstr, 2.0)) {
    fputs($fp, $request);
    $started = time;
    while((!feof($fp)) and ((time - $started) < 5)) {
    $result .= @fgets($fp, 128);
    }
     fclose($fp);
    }
    return $result;
    } 
     
    $dateHeure = date('c');
     
    // data to be sent
    $flux  =  array ( 'requests_xml' => '<?xml version="1.0" encoding="UTF-8"?><mmie version="2.0"><orders><acknowledged morid="'.$tab_cde_rdc[$i]['ID'].'" datetime="'.$dateHeure.'"><comment>Commande en cours</comment></acknowledged></orders></mmie>');
     
    // please replace this url with the one furnished in your backoffice
    $sCalledurl = 'https://l_url';
     
    // appel à la fonction
    do_post_https_request($sCalledurl,$flux) ;
    le résultat obtenu avec un ou est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    HTTP/1.1 200 OK
    Date: Mon, 12 Jul 2010 09:37:03 GMT
    Server: Apache
    Edge-control: no-store
    X-From: zm32 in D=36149 microseconds
    Content-Length: 182
    Connection: close
    Content-Type: application/xml
     
    <?xml version="1.0" encoding="utf-8"?>
    <response><message type="error">KO</message>
    <request nb="1" status="KO">
    <error>INVALID_REQUEST - PARAM ARE MISSING</error>
    </request>
    </response>
    je souhaite lire le contenu XML avec simpleXml sans tenir compte de l'entête, mais je ne sais pas vraiment comment m'y prendre ??

    Il y a bien un gourou pour me sauver de cette impasse
    Merci d'avance à tous

    BJ

  2. #2
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    la fin de l'entête se trouve à la ligne vide donc tu peux utiliser le code suivant pour uniquement récupérer ce qui se trouve ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
            $resultat = '';
            $entete = TRUE;
     
            while (!feof($fp)) {
                $ligne = fgets($fp);
     
                if (!$entete) {
                    $resultat .= $ligne;
                }
     
                if ($entete 
                    && in_array($ligne, array("\n", "\r\n"))
                ) {
                    $entete = FALSE;
                }
            }
     
            fclose($fp);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 12
    Par défaut RRESOLU
    merci nosferapti
    simple et efficace

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/12/2014, 11h25
  2. [WD11] Comment lire le resultat d'une requête
    Par dj_techno dans le forum WinDev
    Réponses: 3
    Dernier message: 06/03/2009, 22h39
  3. [Debutant] Comment lire la taille d'un fichier binaire ?
    Par Invité dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/12/2003, 19h20
  4. Réponses: 2
    Dernier message: 06/12/2002, 07h50
  5. Réponses: 5
    Dernier message: 20/08/2002, 18h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo