Car2xml

Car2XML 1ste Hoofdstuk


De basis.
De service op http://carcache.digadev.com/cartoxml.php is heel eenvoudig met zowel post als get aan te roepen met vier parameters;
  - Parameters u=<username> en p=<password> : Inlog gegevens kun je onderaan op de pagina aanvragen.
  - Parameter k=<kenteken> : Nederlands kenteken in het formaat xx-xx-xx of de nieuwe reeks xx-xxx-x.
  - Parameter c=<boolean> : indien 'true' wordt er indien mogelijk alleen opgeslagen data gebruikt, dit betekend dat als een kenteken al eens opgevraagd is, er niet ververst wordt met externe data. Dit maakt het proces gemiddeld een stuk sneller maar heeft als nadeel dat wijzigende velden zoals: wa_verzekerd, vervaldatum_apk, aanvang_tenaamstelling enz. niet uptodate zijn maar de waarde hebben zoals die was op de datum en tijd van het veld: laatste_update. Zolang je deze, zich overigens ook nog zelden wijzigende, velden niet gebruikt is er geen probleem. Aangezien wij deze velden niet gaan gebruiken voor onze voorbeeld site zetten wij c=true.
Elke waarde voor c anders dan true heeft tot gevolg dat de data elke twaalf uur ververst wordt.


De php pagina.
Voor de vraag ook maar opkomt; waarom eerst getcardata.php en niet gelijk met het XMLHTTP object http://carcache.digadev.com/cartoxml.php aanroepen vanaf de html pagina?
De reden is tweeledig:
  - Ten eerste security: Je zou dan met XMLHTTP vanaf jouw domein het html bestand lezen (of dat nou vanaf de webserver op je PC of op een domein bij een hosting provider is) en vanaf digadev.com het php bestand, twee verschillende domeinen dus. De standaard beveiliging instellingen van bvb. IE en FF echter staan communicatie tussen domeinen niet toe, je zou dus op de pc van iedere bezoeker van je site de beveiliging instellingen moeten wijzigen om dat te laten werken(?). We plaatsen nu echter het html bestand met XMLHTTP en de koppeling cartoxml.php (z.g.n. 'middeltier') op de zelfde server, de brouwser ziet maar één domein en cartoxml.php verzorgt op de achtergrond de communicatie met digadev.com.
Probleem opgelost!
Creëren wij hiermee dan niet een beveiliging probleem? Nee dus, dit soort beveiliging problemen werkt alleen op het niveau van de brouwser, en dient om te voorkomen dat de brouwser terwijl je naar het ene domein zit te kijken, op de achtergrond gegevens naar een ander domein zit te sturen. Als dit ook voor communicatie tussen servers onderling zou gelden zou het hele internet niet mogelijk zijn. Er wordt op server niveau continu data uitgewisseld.
  - Ten tweede password en username: Aangezien http://carcache.digadev.com/cartoxml.php als parameters je username en password nodig heeft zou, indien je direct vanaf het XMLHTTP object zou werken, iedereen met "Bron bekijken" van bvb. IE of FF je password en username kunnen lezen.
Met een middeltier als getcardata.php zit dat veilig verborgen.
En dan is er natuurlijk nog het voordeel dat als je ooit de data ergens anders weg zou willen halen, een eigen database bvb, je alleen cartoxml.php zou hoeven te wijzigen, niet alle html bestanden die er van afhankelijk zijn.
Vandaar dus.

Kopieer als eerste de volgende code in een bestand getcardata.php.

<?php
header('Content-type: text/xml');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate", true);
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
//
$doc = DOMDocument::load("http://carcache.digadev.com/cartoxml.php?".
	"u=<loginnaam>&p=<wachtwoord>&c=true&k=".$_REQUEST["kenteken"]);
echo $doc->saveXML();
?>


De basis dhtml pagina.
Kopieer deze code in een html bestand, bvb voor Apache index.html en voor IIS default.htm.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="nl" xml:lang="nl">
<head>
<title>Cardata test</title>
</head>
<body>
<p style="margin-top:2px;margin-bottom:2px;padding:2px;border:1px solid gray;">
<input style="font-size:15px;" type="text" id="txtKenteken" size="8" maxlength="8" /> 
<input id="btnZoek" type="button" value="Zoek" />
<span>Bijvoorbeeld: XX-XX-XX is een niet bestaand kenteken, 01-VBB-1 is bestaand.</span>
</p>
<div id="carSiteDiv" style="height:200px;position:relative;overflow:scroll;border:1px solid gray;">
 
</div>
<script>
//<![CDATA[
var xmlHTTP;
window.onload = function(){
	try {
		if (typeof XMLHttpRequest == 'undefined'){
			xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP");
		} else {
			xmlHTTP = new XMLHttpRequest();
		}
		document.getElementById("btnZoek").onclick = getKenteken;
	} catch (e){
		document.getElementById("btnZoek").disabled = true;
		alert(e);
	}
}

function getKenteken(){
	document.getElementById("carSiteDiv").innerText = " ";
	document.getElementById("btnZoek").disabled = true;
	xmlHTTP.open("GET", "getcardata.php?kenteken="+document.getElementById("txtKenteken").value, true);
	xmlHTTP.onreadystatechange = waitHTTP;
	xmlHTTP.send(null);
}

function waitHTTP(){
	if (xmlHTTP.readyState == 4){
		var s = xmlHTTP.responseText;
		s = s.replace(/</g, "&lt;");
		s = s.replace(/>/g, "&gt;");
		s = s.replace(/\n/g, "<br />");
		document.getElementById("carSiteDiv").innerHTML = s;
		document.getElementById("btnZoek").disabled = false;
	}
}
//]]>
</script>
</body>
</html>


Verzoek een nieuwe inlog of een herinnering.

 Code:   E-mail adres:    


De test.
We hebben nu twee bestanden: getcardata.php en index.html voor Apache of default.htm voor IIS.
Pas getcardata.php aan met de loginnaam en het wachtwoord uit je e-mail.
Als je geen webserver hebt en ook geen domein host bij een provider, installeer dan Apache of IIS(Alleen op XP Pro.).
Plaats beide bestanden in de root of een virtuele directory van je webserver.
Als je nog geen PHP hebt ga dan naar www.php.net en haal de laatste stable PHP windows installer en installeer die.
Het is overigens vrij eenvoudig de PHP code om te zetten naar ASP. In combinatie met IIS heb je dan geen PHP nodig.
Start IE, FF, Opera of Safari en ga naar http://localhost/[htmlbestandpath] je zou dan zoiets als onderstaand voorbeeld moeten krijgen.
Type een kenteken in en klik zoek..

  Bijvoorbeeld: XX-XX-XX is een niet bestaand kenteken, 01-VBB-1 is bestaand.

 

Dat is het voor dit hoofdstuk. In het volgend hoofdstuk gaan we de xml transformeren naar html.
Wordt vervolgd...