13. Ejercicio IMPOTS con XML
En este ejercicio, que ya hemos estudiado en numerosas ocasiones, el servidor devuelve los resultados al cliente en forma de un flujo XML.
13.1. El servidor (impots_05B_web)
El servicio web de cálculo de impuestos descrito anteriormente tiene una arquitectura por capas:
![]() |
En el ejemplo anterior, el servicio web enviaba a sus clients una de las dos líneas siguientes:
No se trata de un documento XML bien formado, ya que carece de etiqueta raíz. El nuevo servicio web enviará su respuesta con el siguiente formato:
o
En ambos casos, la respuesta es un documento XML bien formado que puede ser procesado por el módulo [simpleXML].
En el esquema de tres capas, solo debe modificarse la capa [web]. Su código [impots_05B_web] queda así:
<?php
// capa de negocio
require_once "impots_05_metier.php";
// gestión de errores
ini_set("display_errors", "off");
// encabezado UTF-8
header("Content-Type: text/plain; charset=utf-8");
// ------------------------------------------------------------------------------
// el servicio web de Hacienda
// definición de constantes
$HOTE = "localhost";
$PORT = 3306;
$BASE = "dbimpots";
$USER = "root";
$PWD = "";
// los datos necesarios para el cálculo del impuesto se han colocado en la tabla mysqL $TABLE
// perteneciente a la base de datos $BASE. La tabla tiene la siguiente estructura
// límites decimal(10,2), coeffR decimal(6,2), coeffN decimal(10,2)
// los parámetros de las personas sujetas a impuestos (estado civil, número de hijos, salario anual)
// son enviados por el cliente en el formato params=estado civil, número de hijos, salario anual
// los resultados (estado civil, número de hijos, salario anual, impuesto a pagar) se devuelven al cliente
// en el formato <impuesto>impuesto</impuesto>
// o en el formato <error>error</error>, si los parámetros no son válidos
// se recupera la capa [métier] en la sesión
session_start();
if (!isset($_SESSION['metier'])) {
// instanciación de la capa [dao] y de la capa [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'];
// se recupera la línea enviada por el cliente
$params = utf8_encode(htmlspecialchars(strtolower(trim($_POST['params']))));
//print "parámetros recibidos --> $params\n";
$items = explode(",", $params);
// solo debe haber 3 parámetros
if (count($items) != 3) {
print "<reponse><erreur>[$params] : nombre de paramètres invalides</erreur></reponse>\n";
exit;
}//if
// el primer parámetro (estado civil) debe ser sí/no
$marié = trim($items[0]);
if ($marié != "oui" and $marié != "non") {
print "<reponse><erreur>[$params] : 1er paramètre invalide</erreur></reponse>\n";
exit;
}//if
// el segundo parámetro (número de hijos) debe ser un número entero
if (!preg_match("/^\s*(\d+)\s*$/", $items[1], $champs)) {
print "<reponse><erreur>[$params] : 2ième paramètre invalide</erreur></reponse>\n";
exit;
}//si
$enfants = $champs[1];
// el tercer parámetro (salario) debe ser un número entero
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];
// se calcula el impuesto
$impôt = $metier->calculerImpot($marié, $enfants, $salaire);
// se devuelve el resultado
print "<reponse><impot>$impôt</impot></reponse>\n";
// fin
exit;
El formato de la respuesta del servicio web se modifica en las líneas 35, 47, 53, 58, 64 y 71.
13.2. El cliente (client_impots_05b_web)
El cliente se modifica para tener en cuenta el nuevo formato de la respuesta. Se utiliza [simpleXML] para procesarla:
<?php
// cliente de impuestos
// gestión de errores
ini_set("display_errors", "off");
// ---------------------------------------------------------------------------------
// una clase de funciones de utilidad
class Utilitaires {
...
}
// main -----------------------------------------------------
// definición de constantes
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
// datos del servidor
$HOTE = "localhost";
$PORT = 80;
$urlServeur = "/exemples-web/impots_05B_web.php";
...
exit;
function calculerImpot($HOTE, $PORT, $urlServeur, &$cookie, $params) {
// conecta al cliente a ($HOTE,$PORT,$urlServeur)
// envía la cookie $cookie si esta no está vacía. $cookie se pasa por referencia
// envía $params al servidor
// procesa la línea del resultado
...
// lectura de la línea del resultado
$ligne = fgets($connexion, 1000);
// se cierra la conexión
fclose($connexion);
// cálculo del resultado
$xml = new SimpleXMLElement($ligne);
$erreur = isset($xml->erreur) ? $xml->erreur : "";
$impôt = isset($xml->impot) ? $xml->impot : "";
// retorno
return array($erreur, $impôt);
}
- línea 32: se lee la respuesta del servidor. Se trata de un documento XML.
- línea 36: se crea un objeto SimpleXML a partir del documento XML recibido.
- línea 37: el posible mensaje de error
- línea 38: el posible importe del impuesto
