Consommer un service web
Il n'y a aucun intérêt à consommer ses propres WS. En clair, votre serveur ne doit pas s'appeler lui-même, sauf si c'est pour faire des tests.
Cas d'école
Vous gérez un annuaire des gîte de randonnée. Il est assez facile de trouver ces annuaires avec leurs coordonnées GPS sur de nombreux sites web. Mais ce qui manque à ces gîtes, en dehors de leur localisation est l'altitude. Cette donnée peut être vitale pour des clients qui souffriraient de problèmes respiratoires ou cardiaques à haute altitude.
Comment récupérer l'altitude de ces gîtes et l'intégrer à la base de données?
La première solution: appeler les gérants de gîtes et leur poser la question: long et aléatoire.
La seconde solution: demander aux visiteurs qui connaissent lesdits gîtes de combler cette lacune: risqué si c'est pas la bonne donnée qui est saisie.
Pour notre part, nous avons choisi de poser la question directement à l'API de Google MAPS:
http://maps.googleapis.com/maps/api/elevation/xml?locations=45.2451,2.54276&sensor=false
Ici le paramètre location combine la latitude suivie de la longitude: 45.2451,2.54276. Nous supposons que pour chaque gîte nous avons déjà ces données.. Voici ce que nous renvoie l'API de Goggle Maps si on utilise notre URL:
<?xml version="1.0" encoding="UTF-8"?> <ElevationResponse> <status>OK</status> <result> <location> <lat>45.2451000</lat> <lng>2.5427600</lng> </location> <elevation>966.8056030</elevation> <resolution>152.7032318</resolution> </result> </ElevationResponse>
Ici la réponse est visible:
Donc, pour chaque visiteur de notre site d'information, voici la stratégie:
- extraire la fiche gîte demandée
- si l'altitude est déjà enregistrée, ne rien faire....
- si l'altitude n'est pas connue:
- demander à l'API Google Maps l'altitude
- récupérer l'altitude
- mettre à jour la fiche du gîte en rajoutant l'altitude
- afficher la fiche du gîte complète
Appel du WS de l'API Google Maps sans ZF
Nous allons d'abord voir comment appeler l'APi de Google Maps sans ZF:
/** * Récupère altitude d'un point géographique donné * @param $lat decimal latitude * @param $lon decimal longitude * @return int altitude en mètres, sans décimales */ function getElevationFromGoogle($lat, $lon) { $url = "http://maps.googleapis.com/maps/api/elevation/" . "xml?locations=$lat,$lon&sensor=false"; $result = file_get_contents($url); $xml = simplexml_load_string($result); return round($xml->result->elevation); }
Voilà. En quelques lignes de code, nous venons de créer notre première fonction qui consomme un WS!
Nous ne rentrerons pas dans le détail de l'exploitation de cette fonction.
Notez que l'API de Google Maps renvoie également un élément status avec la valeur OK. Par convention, beaucoup de WS renvoient un status mais pas tous. Il n'y a pas de règle ni de norme. A vous de consulter la documentation des WS disponibles et de les tester.
Nous avons donné dans notre cas d'école un scénario d'appel du WS de l'API de Google Maps. Nous vous déconseillons de faire des appels en rafale et trop grande quantité. Si vous procédez ainsi, Google va mettre votre serveur en liste noire! C'est pour cette raison que dans notre scénario la fiche d'un gîte n'est mise à jour que quand un utilisateur consulte cette fiche.
Ainsi votre base de données est fiabilisée au fil de l'eau et en fonction de la fréquentation réelle de votre site web. Rappelons que les fiches qui sont à jour ne génèrent aucun trafic vers l'API de Google Maps.