Skip to content

13. IMPOTS alıştırması ile XML

Daha önce birçok kez incelediğimiz bu alıştırmada, sunucu sonuçları XML akışı biçiminde istemciye geri gönderir.

13.1. Sunucu (impots_05B_web)

Daha önce yazılan vergi hesaplama web hizmeti, katmanlı bir mimariye sahiptir:

Önceki örnekte, web hizmeti müşterilerine aşağıdaki iki satırdan birini gönderiyordu:

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

Bu, kök etiketi olmadığı için geçerli bir XML belgesi değildir. Yeni web hizmeti, yanıtını şu biçimde gönderecektir:

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

veya

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

Her iki durumda da yanıt, XML modülü tarafından işlenebilen, biçimlendirilmiş bir XML belgesidir.

Üç katmanlı şemada, yalnızca [web] katmanı değiştirilmelidir. [impots_05B_web] kodu şu şekilde olur:


<?php

// iş mantığı katmanı
require_once "impots_05_metier.php";

// hata yönetimi
ini_set("display_errors", "off");

// başlık UTF-8
header("Content-Type: text/plain; charset=utf-8");

// ------------------------------------------------------------------------------
// vergi web hizmeti
// sabitlerin tanımlanması
$HOTE = "localhost";
$PORT = 3306;
$BASE = "dbimpots";
$USER = "root";
$PWD = "";
// vergi hesaplaması için gerekli veriler mysqL $TABLE
// tablosuna yerleştirilmiştir. Bu tablo, $BASE veritabanına aittir. Tablonun yapısı aşağıdaki gibidir
// sınırlar decimal(10,2), coeffR decimal(6,2), coeffN decimal(10,2)
// vergiye tabi kişilerin parametreleri (medeni durum, çocuk sayısı, yıllık maaş)
// müşteri tarafından params=medeni durum, çocuk sayısı, yıllık maaş biçiminde gönderilir
// sonuçlar (medeni durum, çocuk sayısı, yıllık maaş, ödenecek vergi) müşteriye geri gönderilir
// <vergi>vergi</vergi> biçiminde
// veya parametreler geçersizse <hata>hata</hata> biçiminde
// oturumda [métier] katmanı alınır
session_start();
if (!isset($_SESSION['metier'])) {
// [dao] katmanı ve [métier] katmanının örneklenmesi
  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'];

// istemci tarafından gönderilen satır alınır
$params = utf8_encode(htmlspecialchars(strtolower(trim($_POST['params']))));
//print "alınan parametreler --> $params\n";
$items = explode(",", $params);
// sadece 3 parametre olmalı
if (count($items) != 3) {
  print "<reponse><erreur>[$params] : nombre de paramètres invalides</erreur></reponse>\n";
  exit;
}//if
// ilk parametre (medeni durum) evet/hayır olmalıdır
$marié = trim($items[0]);
if ($marié != "oui" and $marié != "non") {
  print "<reponse><erreur>[$params] : 1er paramètre invalide</erreur></reponse>\n";
  exit;
}//if
// ikinci parametre (çocuk sayısı) bir tamsayı olmalıdır
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];
// üçüncü parametre (maaş) bir tamsayı olmalıdır
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];
// vergi hesaplanır
$impôt = $metier->calculerImpot($marié, $enfants, $salaire);
// sonuç döndürülür
print "<reponse><impot>$impôt</impot></reponse>\n";
// son
exit;

Web hizmetinin yanıt biçimi 35, 47, 53, 58, 64 ve 71. satırlarda değiştirilir.

13.2. İstemci (client_impots_05b_web)

Müşteri, yeni yanıt biçimini dikkate alacak şekilde değiştirilir. Bu yanıtı işlemek için [simpleXML] kullanılır:


<?php

// vergi müşterisi
// hata yönetimi
ini_set("display_errors", "off");

// ---------------------------------------------------------------------------------
// yardımcı işlevler sınıfı
class Utilitaires {
...
}

// main -----------------------------------------------------
// sabitlerin tanımı
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
// sunucu verileri
$HOTE = "localhost";
$PORT = 80;
$urlServeur = "/exemples-web/impots_05B_web.php";

...
exit;

function calculerImpot($HOTE, $PORT, $urlServeur, &$cookie, $params) {
  // istemciyi ($HOTE,$PORT,$urlServeur) adresine bağlar
// boş değilse $cookie çerezini gönderir. $cookie referans olarak aktarılır
//, $params'i sunucuya gönderir
// sonuç satırını işler
...
  // sonuç satırını okur
  $ligne = fgets($connexion, 1000);
  // bağlantı kapatılıyor
  fclose($connexion);
  // sonucu hesaplar
  $xml = new SimpleXMLElement($ligne);
  $erreur = isset($xml->erreur) ? $xml->erreur : "";
  $impôt = isset($xml->impot) ? $xml->impot : "";
  // geri dönüş
  return array($erreur, $impôt);
}
  • 32. satır: Sunucunun yanıtı okunur. Bu, XML adlı bir belgedir.
  • 36. satır: Alınan XML belgesinden bir SimpleXML nesnesi oluşturulur.
  • satır 37: varsa hata mesajı
  • satır 38: varsa vergi tutarı