Speak English? Click here to read my English blog!

Communiquer entre serveurs par requêtes xml

Posté par jbl le 28 mar 2009 dans PHP2 commentaires

J'ai eu comme problématique de convertir en php une fonctionnalité écrite en asp. Un serveur communique avec un autre par le biais de requêtes xml.

Le serveur A envoie une requête XML au serveur B. Dans cette requête xml il indique les informations désirées.

Le serveur B lui retourne en xml les informations demandées. Le serveur A avec apache et php doit donc récupérer et traiter des données xml. C'est ici que j'interviens.

En ASP on se sert de :

// envoyer et récupérer le xml
set objSrvHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
// pour traiter le xml
set objXMLReceive = Server.CreateObject("MSXML2.DOMDocument")

En php sans installer rien de plus on a la solution basique du fsockopen

$page = '/GetProduct.aspx';
$host = 'www.urldusite.com';
//requête xml afin de demander la catégorie produit 250
$req = '<?xml version="1.0"?><Request>'.
'<Category>250</Category>'.
'</Request>';

$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)\n";
} else {
    $header = "GET $page HTTP/1.1\r\n";
    $header .= "Host: $host\r\n";
    $header .= "Content-Type: text/xml\r\n";
    $header .= "Content-Length: " . strlen($req) . "\r\n";
    $header .= "Connection: close\r\n\r\n";

    fwrite($fp, $header.$req);
    while (!feof($fp)) {
        $items .= fgets($fp, 1024);
    }
    fclose($fp);
}
// la réponse du serveur est stockée dans $items

Avec cette méthode on récupère ce qu'on veut à savoir les données xml mais aussi des choses moins intéressantes qu'on appelle entête. Selon comment on va traiter ces informations il est important d'en tenir compte.

HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Sat, 28 Mar 2009 10:42:26 GMT
Connection: close
Content-Type: text/xml
Expires: Fri, 27 Mar 2009 10:42:24 GMT
Set-Cookie: ShopperManager%2F=SHOPPERMANAGER%2F=0LX925TK2PT92GW500AL08MS25MSEBE2; expires=Thu, 31-Dec-2009 23:00:00 GMT; path=/
Set-Cookie: ASPSESSIONIDGQQQGRQQ=HIJLBCCAKCINKHKNLBGGNDGL; path=/
Cache-control: no-cache
Transfer-Encoding: chunked

11a6
<?xml version="1.0" encoding="ISO-8859-1"?><Response>
<Product><Reference>A55222</Reference><Description>En stock</Description></Product>
<Product><Reference>A65892</Reference><Description>En stock</Description></Product>
</Response>
0

SimpleXML n'est pas installé sur le serveur j'ai donc utilisé l'expression rationnelle eregi pour récupérer les informations désirées. L'entête comprise dans la réponse ne me gène donc pas.

// on vérifie que la syntaxe xml corresponde à ce qu'on attend
if( !eregi('<Response>(.*)</Response>', $items) ) {

 die("erreur");

} else {

 // on crée un tableau avec l'ensemble des informations produit
 $items = explode('<Product>', $items);
 $countitems = count($items)-1;

 for( $i = 0; $i < $countitems; $i++ ) {
  // produit par produit on va chercher l'info
  eregi('<Reference>(.*)</Reference>', $items[$i+1], $name);
  eregi('<Description>(.*)</Description>', $items[$i+1], $desc);
  echo $name[1].'<br/>'.$desc[1].'<br/><br/>';
 }

}

Pour plus d'informations sur le fsockopen et en particulier cet exemple de code.


2 commentaires

» Flux RSS des commentaires
  1. [...] Communiquer entre serveurs par requêtes xml [...]

  2. Merci pour toutes ces informations et ces astuces. C’ est un blog très intéressant a lire

Commenter