Skip to content

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:

<erreur>message d'erreur</erreur>
<impot>montant de l'impôt</impot>

Dit is geen correct opgebouwd XML-document, omdat het geen root-tag heeft. De nieuwe webservice zal zijn antwoord in de volgende vorm versturen:

<reponse><erreur>message d'erreur</erreur></reponse>

of

<reponse><impot>montant de l'impôt</impot></reponse>

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