Introduction au langage PHP 5 par l'exemple
XIV. Exercice IMPOTS avec XML▲
Dans cet exercice déjà étudié de nombreuses fois, le serveur renvoie les résultats au client sous la forme d'un flux XML.
XIV-A. Le serveur (impots_05B_web)▲
Le service web de calcul de l'impôt écrit précédemment a une architecture en couches :
Dans l'exemple précédent, le service web envoyait à ses clients l'une des deux lignes suivantes :
Sélectionnez 1.
2.
<erreur>message d'erreur</erreur>
<impot>montant de l'impôt</impot>
Ce n'est pas un document XML bien formé car il n'a pas de balise racine. Le nouveau service web enverra sa réponse sous la forme suivante :
Sélectionnez 1.
<reponse><erreur>message d'erreur</erreur></reponse>
Ou
Sélectionnez 1.
<reponse><impot>montant de l'impôt</impot></reponse>
Dans les deux cas, la réponse est un document XML bien formé qui peut être exploité par le module [simpleXML].
Dans le schéma à trois couches, seule la couche [web] doit être modifiée. Son code [impots_05B_web] devient le suivant :
Sélectionnez 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.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
<?php
require_once "impots_05_metier.php";
ini_set("display_errors", "off");
header("Content-Type: text/plain; charset=utf-8");
$HOTE = "localhost";
$PORT = 3306;
$BASE = "dbimpots";
$USER = "root";
$PWD = "";
session_start();
if (!isset($_SESSION['metier'])) {
try {
$_SESSION['metier'] = new ImpotsMetier(new ImpotsDaoWithMySQL($HOTE, $PORT, $BASE, $USER, $PWD));
} catch (ImpotsException $ie) {
print "<reponse><erreur>Erreur : " . utf8_encode($ie->getMessage() . "</erreur></reponse>");
exit;
}
}
$metier = $_SESSION['metier'];
$params = utf8_encode(htmlspecialchars(strtolower(trim($_POST['params']))));
$items = explode(",", $params);
if (count($items) != 3) {
print "<reponse><erreur>[$params] : nombre de paramètres invalides</erreur></reponse>\n";
exit;
}
$marié = trim($items[0]);
if ($marié != "oui" and $marié != "non") {
print "<reponse><erreur>[$params] : 1er paramètre invalide</erreur></reponse>\n";
exit;
}
if (!preg_match("/^\s*(\d+)\s*$/", $items[1], $champs)) {
print "<reponse><erreur>[$params] : 2ième paramètre invalide</erreur></reponse>\n";
exit;
}
$enfants = $champs[1];
if (!preg_match("/^\s*(\d+)\s*$/", $items[2], $champs)) {
print "<reponse><erreur>[$params] : 3ième paramètre invalide</erreur></reponse>\n";
exit;
}
$salaire = $champs[1];
$impôt = $metier->calculerImpot($marié, $enfants, $salaire);
print "<reponse><impot>$impôt</impot></reponse>\n";
exit;
Le format de la réponse du service web est modifiée aux lignes 35, 47, 53, 58, 64 et 71.
XIV-B. Le client (client_impots_05b_web)▲
Le client est modifié pour tenir compte du nouveau format de la réponse. On utilise [simpleXML] pour traiter celle-ci :
Sélectionnez 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.
<?php
ini_set("display_errors", "off");
class Utilitaires {
...
}
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
$HOTE = "localhost";
$PORT = 80;
$urlServeur = "/exemples-web/impots_05B_web.php";
...
exit;
function calculerImpot($HOTE, $PORT, $urlServeur, &$cookie, $params) {
...
$ligne = fgets($connexion, 1000);
fclose($connexion);
$xml = new SimpleXMLElement($ligne);
$erreur = isset($xml->erreur) ? $xml->erreur : "";
$impôt = isset($xml->impot) ? $xml->impot : "";
return array($erreur, $impôt);
}
- ligne 32 : la réponse du serveur est lue. C'est un document XML.
- ligne 36 : un objet SimpleXML est construit à partir du document XML reçu.
- ligne 37 : l'éventuel message d'erreur
- ligne 38 : l'éventuel montant de l'impôt
Le contenu de cet article est rédigé par Serge Tahé et est mis à disposition selon les termes de la
Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2011 Developpez.com.