Skip to content

13. Вправа IMPOTS із використанням XML

У цьому вправі, яке ми вже неодноразово розглядали, сервер повертає результати клієнту у вигляді потоку XML.

13.1. Сервер (impots_05B_web)

Веб-сервіс для розрахунку податку, написаний раніше, має багаторівневу архітектуру:

У попередньому прикладі веб-сервіс надсилав своїм клієнтам один із двох таких рядків:

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

Це не є правильно сформованим документом XML, оскільки він не має кореневого тегу. Новий веб-сервіс надсилатиме свою відповідь у такому форматі:

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

або

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

В обох випадках відповідь є правильно сформованим документом XML, який може бути оброблений модулем [simpleXML].

У трирівневій схемі потрібно змінити лише рівень [web]. Його код [impots_05B_web] набуває такого вигляду:


<?php

// бізнес-шар
require_once "impots_05_metier.php";

// обробка помилок
ini_set("display_errors", "off");

// заголовок UTF-8
header("Content-Type: text/plain; charset=utf-8");

// ------------------------------------------------------------------------------
// веб-сервіс податкової служби
// визначення констант
$HOTE = "localhost";
$PORT = 3306;
$BASE = "dbimpots";
$USER = "root";
$PWD = "";
// дані, необхідні для розрахунку податку, були розміщені в таблиці mysqL $TABLE
//, що належить до бази даних $BASE. Таблиця має таку структуру
// межі decimal(10,2), coeffR decimal(6,2), coeffN decimal(10,2)
// параметри платників податків (сімейний стан, кількість дітей, річний заробіток)
// надсилаються клієнтом у форматі params=сімейний стан, кількість дітей, річний заробіток
// результати (сімейний стан, кількість дітей, річний заробіток, сума податку до сплати) надсилаються клієнту
// у форматі <податок>податок</податок>
// або у вигляді <помилка>помилка</помилка>, якщо параметри недійсні
// у сесії отримується шар [métier]
session_start();
if (!isset($_SESSION['metier'])) {
// інстанціювання шару [dao] та шару [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'];

// отримуємо рядок, надісланий клієнтом
$params = utf8_encode(htmlspecialchars(strtolower(trim($_POST['params']))));
//print "отримані параметри --> $params\n";
$items = explode(",", $params);
// має бути лише 3 параметри
if (count($items) != 3) {
  print "<reponse><erreur>[$params] : nombre de paramètres invalides</erreur></reponse>\n";
  exit;
}//if
// перший параметр (сімейний стан) повинен мати значення «так» або «ні»
$marié = trim($items[0]);
if ($marié != "oui" and $marié != "non") {
  print "<reponse><erreur>[$params] : 1er paramètre invalide</erreur></reponse>\n";
  exit;
}//if
// другий параметр (кількість дітей) має бути цілим числом
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;
}//if
$salaire = $champs[1];
// розраховується податок
$impôt = $metier->calculerImpot($marié, $enfants, $salaire);
// повертаємо результат
print "<reponse><impot>$impôt</impot></reponse>\n";
// кінець
exit;

Формат відповіді веб-сервісу змінено у рядках 35, 47, 53, 58, 64 та 71.

13.2. Клієнт (client_impots_05b_web)

Клієнт змінено з урахуванням нового формату відповіді. Для її обробки використовується [simpleXML]:


<?php

// клієнт податків
// обробка помилок
ini_set("display_errors", "off");

// ---------------------------------------------------------------------------------
// клас допоміжних функцій
class Utilitaires {
...
}

// main -----------------------------------------------------
// визначення констант
$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) {
  // підключає клієнта до ($HOTE,$PORT,$urlServeur)
// надсилає файл cookie $cookie, якщо він не порожній. $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);
}
  • рядок 32: зчитується відповідь сервера. Це документ XML.
  • рядок 36: на основі отриманого документа XML створюється об’єкт SimpleXML.
  • рядок 37: можливе повідомлення про помилку
  • рядок 38: можлива сума податку