13. Oefening IMPOTS met XML
In deze oefening, die we al vele malen hebben bestudeerd, stuurt de server de resultaten terug naar de client in de vorm van een XML-stream.
13.1. De server (impots_05B_web)
De eerder geschreven webservice voor belastingberekening heeft een gelaagde architectuur:
![]() |
In het vorige voorbeeld stuurde de webservice een van de volgende twee regels naar zijn clients:
Dit is geen correct opgebouwd XML-document, omdat het geen root-tag heeft. De nieuwe webservice zal zijn antwoord in de volgende vorm versturen:
of
In beide gevallen is het antwoord een correct opgebouwd XML-document dat door de module [simpleXML] kan worden verwerkt.
In het drielaagse schema hoeft alleen de laag [web] te worden aangepast. De code [impots_05B_web] wordt dan als volgt:
<?php
// bedrijfslaag
require_once "impots_05_metier.php";
// foutbeheer
ini_set("display_errors", "off");
// header UTF-8
header("Content-Type: text/plain; charset=utf-8");
// ------------------------------------------------------------------------------
// de webservice van de belastingdienst
// definitie van constanten
$HOTE = "localhost";
$PORT = 3306;
$BASE = "dbimpots";
$USER = "root";
$PWD = "";
// de gegevens die nodig zijn voor de berekening van de belasting zijn in de tabel mysqL $TABLE
// die deel uitmaakt van de database $BASE. De tabel heeft de volgende structuur
// grenzen decimal(10,2), coeffR decimal(6,2), coeffN decimal(10,2)
// de parameters van de belastingplichtigen (burgerlijke staat, aantal kinderen, jaarsalaris)
// worden door de klant verzonden in de vorm params=burgerlijke staat, aantal kinderen, jaarsalaris
// de resultaten (burgerlijke staat, aantal kinderen, jaarsalaris, te betalen belasting) worden teruggestuurd naar de klant
// in de vorm <belasting>belasting</belasting>
// of in de vorm <fout>fout</fout>, als de parameters ongeldig zijn
// de laag [métier] wordt in de sessie opgehaald
session_start();
if (!isset($_SESSION['metier'])) {
// instantiëring van de laag [dao] en de laag [métier]
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'];
// de door de klant verzonden regel wordt opgehaald
$params = utf8_encode(htmlspecialchars(strtolower(trim($_POST['params']))));
//print "ontvangen parameters --> $params\n";
$items = explode(",", $params);
// er mogen slechts 3 parameters zijn
if (count($items) != 3) {
print "<reponse><erreur>[$params] : nombre de paramètres invalides</erreur></reponse>\n";
exit;
}//if
// de eerste parameter (burgerlijke staat) moet ja/nee zijn
$marié = trim($items[0]);
if ($marié != "oui" and $marié != "non") {
print "<reponse><erreur>[$params] : 1er paramètre invalide</erreur></reponse>\n";
exit;
}//if
// de tweede parameter (aantal kinderen) moet een geheel getal zijn
if (!preg_match("/^\s*(\d+)\s*$/", $items[1], $champs)) {
print "<reponse><erreur>[$params] : 2ième paramètre invalide</erreur></reponse>\n";
exit;
}//if
$enfants = $champs[1];
// de derde parameter (salaris) moet een geheel getal zijn
if (!preg_match("/^\s*(\d+)\s*$/", $items[2], $champs)) {
print "<reponse><erreur>[$params] : 3ième paramètre invalide</erreur></reponse>\n";
exit;
}//if
$salaire = $champs[1];
// de belasting wordt berekend
$impôt = $metier->calculerImpot($marié, $enfants, $salaire);
// het resultaat wordt teruggestuurd
print "<reponse><impot>$impôt</impot></reponse>\n";
// einde
exit;
Het formaat van het antwoord van de webservice wordt gewijzigd op de regels 35, 47, 53, 58, 64 en 71.
13.2. De client (client_impots_05b_web)
De client is aangepast om rekening te houden met het nieuwe antwoordformaat. We gebruiken [simpleXML] om dit te verwerken:
<?php
// belastingklant
// foutbeheer
ini_set("display_errors", "off");
// ---------------------------------------------------------------------------------
// een klasse met hulpprogramma's
class Utilitaires {
...
}
// main -----------------------------------------------------
// definitie van constanten
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
// servergegevens
$HOTE = "localhost";
$PORT = 80;
$urlServeur = "/exemples-web/impots_05B_web.php";
...
exit;
function calculerImpot($HOTE, $PORT, $urlServeur, &$cookie, $params) {
// verbindt de client met ($HOTE,$PORT,$urlServeur)
// verzendt de cookie $cookie als deze niet leeg is. $cookie wordt doorverwezen
// stuurt $params naar de server
// verwerkt de regel uit het resultaat
...
// leest de regel uit het resultaat
$ligne = fgets($connexion, 1000);
// de verbinding wordt verbroken
fclose($connexion);
// bereken het resultaat
$xml = new SimpleXMLElement($ligne);
$erreur = isset($xml->erreur) ? $xml->erreur : "";
$impôt = isset($xml->impot) ? $xml->impot : "";
// terug
return array($erreur, $impôt);
}
- regel 32: het antwoord van de server wordt ingelezen. Het is een document XML.
- regel 36: er wordt een object SimpleXML aangemaakt op basis van het ontvangen document XML.
- regel 37: de eventuele foutmelding
- regel 38: het eventuele belastingbedrag
