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.