Communiquer entre serveurs par requêtes xml
Posté par jbl le 28 mar 2009 dans PHP • 2 commentairesJ'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.







[...] Communiquer entre serveurs par requêtes xml [...]
Merci pour toutes ces informations et ces astuces. C’ est un blog très intéressant a lire