3. AJAX - Asynchronous JavaScript and XML HTTP
Transcription
3. AJAX - Asynchronous JavaScript and XML HTTP
3. AJAX Asynchronous JavaScript and XML Inhalt: XMLHttpRequest-Klasse Verschiedene Wege zum dynamischen Laden von Informationen Übertragung von Text vs. XML JSON - Übertragungsmodell Peter Sobe Internettechnologien 1 HTTP-Interaktionen (1) Bislang: Webinhalte laden durch Eingabe einer URL Klicken einer Link-URL Absenden eines Formulars (GET, POST) Webbrowser HTTPProtokoll Webserver Gewünschte Erweiterung: Interaktives Nachladen von Webinhalten, ohne jedesmal eine neue Webseite zu laden. Beispiele: Mausklick auf Bereich → Nachladen eines Details Nachladen von Hilfe- und Erklärungstexten Formulare mit InputFeldern, die nur in Spezialfällen erscheinen Immer Aufbau einer neuen Webseite. Peter Sobe Internettechnologien 2 HTTP-Interaktionen (2) Interaktives Anzeigen und dynamischer Webseitenaufbau sind bereits durch Javascript möglich. Grenzen von Javascript (ohne die nachfolgende Erweiterung): Zugriff auf Dateien der Client-Seite nicht möglich Zugriff auf Dateien auf Serverseite bislang auch nicht möglich Grenzen von PHP: Zugriff auf Dateien und Datenanken ist immer mit dem vollständigen Laden einer PHP-Seite verbunden Benötigt: Nachlade-Funktion innerhalb Client-Script (Javascript), die wie der Browser selbst HTTP-Protokollaktionen auslösen und Ergebnisse entgegen nehmen kann. Peter Sobe Internettechnologien 3 XMLHttpRequest-Klasse Neue Javascript-Klasse XMLHttpRequest Browser Webseite mit Javascript XMLHttpRequestObjekt Web-Server ggf. mit Scripting Peter Sobe Internettechnologien 4 AJAX Technologie Asynchroneous Javascript and XML (AJAX) ermöglicht Webseiten, die sich wie lokale Anwendungs-GUIs verhalten Teilinhalte können verändert bzw. aktualisiert werden, ohne die ganze Webseite neu zu laden Schnelleres Reagieren auf Nutzerinteraktionen, da weniger Daten übertragen werden Übertragen von eingegebenen Nutzerdaten an den Server (ohne Neuladen der Seite, wie beim alten klassischen Formular-Submit) Asynchrone Kommunikation mit dem Webserver, d.h. von der Oberfläche im zeitlichen Verhalten entkoppelt Peter Sobe Internettechnologien 5 XMLHttpRequest – Ein Minimalbeispiel (1) <!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" xml:lang="de" lang="de"> <head> <title>JavaScript und HTTP</title> <script type="text/javascript"> //<![CDATA[ window.onload = function() { var req = (window.XMLHttpRequest) ? new XMLHttpRequest() : ((window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : false ); req.open("GET", "dyntext.txt", true); req.onreadystatechange = function() { if (req.readyState==4) { if (req.status == 200) // Fortsetzung auf der folgenden Seite Peter Sobe Internettechnologien 6 XMLHttpRequest – Ein Minimalbeispiel (2) Fortsetzung: { var d = document.getElementById("dyntext"); d.innerHTML = req.responseText; } } } req.send(null); Das Skript setzt voraus, dass auf dem Server eine Datei “dyntext.txt“ vorhanden ist. Deren Inhalt wird in die Webeseite eingebaut. } //]]> </script> </head> <body> <div id=“dyntext"></div> // hier erscheint der nachgeladene Text </body> </html> Peter Sobe Internettechnologien 7 XMLHttpRequest - Klasse Verschiedene Klassen in Browsern, je nach Plattform (Microsoft, Gecko-Browser, u.a.) Instanziierung der Klasse für Gecko1-basierte Browser (Mozilla, Firefox, Thunderbird): var req = new XMLHttpRequest(); Instanziierung der Klasse für Microsoft-basierte Browser (IE): var req = new ActiveXObject(“Microsoft.XMLHTTP“); Zum Teil werden ausgewählte Versionen des XMLHTTP-Objekts benötigt: var req = new ActiveXObject(“Msxml2.XMLHTTP.5.0“); 1 Gecko ist eine s.g. Rendering Engine, die von der Mozilla Foundation entwickelt wurde Peter Sobe Internettechnologien 8 XMLHttpRequest Instanzzierung (1) Benutzung des ?-Operators in Zuweisungen: rechte Seite wenn nicht erfüllt var abs_x = (x>0) ? x : x*(-1); Bedingung rechte Seite wenn erfüllt Versuch, die geeignete Klasse zu instanziieren: var req = (window.XMLHttpRequest) ? new XMLHttpRequest() : ((window.ActiveXObject) ? new ActiveXObject(“Microsoft.XMLHTTP“): false ); Damit „laufen“ Ajax-Webseiten sowohl in Microsoft, als auch in GeckoBrowsern Peter Sobe Internettechnologien 9 XMLHttpRequest Instanziierung (1) try-catch Kaskade zum erreichen der bestmöglichen AJAXUnterstützung: <script type="text/javascript"> //<![CDATA[ if (window.ActiveXObject) { try { req = new ActiveXObject(“Msxml2.XMLHTTP.5.0“); } catch (e) { try { req = new ActiveXObject(“Msxml2.XMLHTTP.4.0“); } catch (e) { try { req = new ActiveXObject(“Msxml2.XMLHTTP.3.0“); } catch (e) { try { req = new ActiveXObject(“Microsoft.XMLHTTP“); } catch (e) { req = false; } }}} }… Peter Sobe Internettechnologien 10 XMLHttpRequest Instanziierung (2) try-catch Kaskade über Array: <script type="text/javascript"> //<![CDATA[ var msxml = [ "MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP„ ]; if (window.ActiveXObject) { for (var i=0; i<msxml.length; i++) { try { ret = new ActiveXObject(msxml[i]); break; } catch(e) {} } } //]]> </script> Peter Sobe Internettechnologien 11 Wege zum dynamischen Laden (1) Laden einer Textdatei über XMLHttpRequest: Funktion open(“GET“, “dateiname.txt“, …) Entnahme des Inhalts aus Element responseText Laden einer XML-Datei: Funktion open(“GET”, “dateiname.xml”, …) Entnahme der Daten aus responseXML Traversal des DOM-Trees des XML-Objekts und Einbauen der Informationen in die Webseite (siehe seexhtml.xhtml aus Übungen) Laden von HTML-formatierten Inhalten aus einer Datei: Inhalte als Text anfordern, z.B. open(“GET“,“info.txt“, …) Einfügen der formatierten Inhalte aus responseText als innerHTML bereits existierender Elemente in der Webseite Peter Sobe Internettechnologien 12 Wege zum dynamischen Laden (2) Laden einer Skriptdatei über XMLHttpRequest: Funktion open(“GET“, “dateiname.php“, …) Bei Anforderung des Objekts kann serverseitig z.B. die Abfrage von Informationen aus einer Datenbank, oder das Lesen von Daten aus einer Datei und eine anschließende Formatierung erfolgen. Kombination von server- und client-seitigem Scripting möglich Peter Sobe Internettechnologien 13 Methoden XMLHttpRequest / ActiveXObject (1) Ausgangspunkt ist das Request-Objekt req, das wie vorab beschrieben instanziiert wurde. Es existiert eine Schnittmenge von Methoden die gleich arbeiten req.setRequestHeader(key,value) – erlaubt das Setzen eines optionalen Request Headers req.open(method, url, [syncFlag, username, password]) – der Request wird an die gewünschte Zieladresse (url) gestartet. Die Methode kann GET, POST, HEAD, PUT, DELETE sein. Das syncFlag gibt an, ob synchron (false) oder asynchron (true, Standardwert) gearbeitet werden soll. Eine Authentifikation mittels username, password ist bei PUT und DELETE notwendig. Peter Sobe Internettechnologien 14 Methoden XMLHttpRequest / ActiveXObject (2) Request-Objekt Methoden (Fortsetzung): req.send(body|null) – erst mit send erfolgt das Absenden des Requests, danach kann unmittelbar die Antwort des Servers folgen, sofern eine asynchrone Übertragung vereinbart wurde. Im body können Nutzerdaten an den Server übertragen werden. req.abort() – beendet den aktuell ausgelösten Request req.getResponseHeaders() – erzeugt eine Liste aller vorhandenen Header als key-value-Paare in einem String req.getResponseHeader(name) – gibt den Wert des durch name angefragten Headers zurück Peter Sobe Internettechnologien 15 Methoden XMLHttpRequest / ActiveXObject (3) Request-Objekt Methoden (Fortsetzung): Ein gültiger Request muss mindestens mit den Methoden open() und send() vorbereitet werden. Beispiel: var req = new XMLHttpRequest; req.open(“GET“,“beispiel.xml“); req.send(null); … Bei asynchroner Übertragung wird Ergebnis von einer Funktion ausgelesen, die als req.onreadystatechange angemeldet wurde. Siehe Eigenschaften. Peter Sobe Internettechnologien 16 Eigenschaften XMLHttpRequest / ActiveXObject (1) Request-Objekt-Eigenschaften: Auch hier gibt es eine funktional gleich gestaltete Schnittmenge req.readyState – gibt den Status des Requests wieder: 0 – unititialized (noch kein open() ausgeführt) 1 – loading (wird gestartet, aber noch nicht abgeschickt durch send()) 2 – loaded (bereit durch send() abgeschickt, aber Antwort steht noch aus) 3- interactive (die Übertragung durch den Server läuft und Teile der Antwort sind bereits in responseText bzw. responseXML verfügbar) 4 – complete (alles vollständig übertragen) req.onreadystatechange – Platz für eine zuzuordnende Funktion, die bei jeder Änderung von req.status ausgeführt wird. Diese Funktion erlaubt, den Zeitpunkt zu finden, an dem das Ergebnis des Request vorliegt. Peter Sobe Internettechnologien 17 Eigenschaften XMLHttpRequest / ActiveXObject (2) Request-Objekt-Eigenschaften (Fortsetzung): req.responseText – Inhalt des Bodys (Typ String) aus der ServerAntwort req.responseXML – XML-Objekt aus der Server-Antwort, sofern eine XML-Datei angefordert wurde req.status – numerischer Wert des Serverstatus am Ende der Übertragung, wenn readystate den Wert 4 enthält, z.B. 200 für erfolgreiche Übertragung, oder 400 für ‘bad request‘ req.statusText – eine Beschreibung des Status am Ende der Übertragung (readystate==4) als String Peter Sobe Internettechnologien 18 Beispiel Überwachung eines asynchronen Requests var req.onreadystatechange = function() { if (req.readyState==4) { if (req.status==200) { /* Antwort weiter verarbeiten */} else { alert(“Request Response Code:“+req.Status); } } } Peter Sobe Internettechnologien 19 Beispiel für einen GET-Request Laden einer Skriptdatei über XMLHttpRequest mit Übergabe von Parametern Funktion open(“GET“, “dateiname.php?param1=wert1¶m2=wert2“, …) Parameterauswertung im PHP-Skript: Ein GET-Request sendet die übergebenen Daten mit der URL mit. … <?php if (isset($_GET[“param1“])) // weitere Verwendung von $_GET[“param1“], z.B. als DB Abfrage $sql = “SELECT name FROM tabelle WHERE wohnort=\“ “. $_GET[“param1“].“\“ “; $ergebnis = mysql_query($sql, $dbverbindung); … echo “$zeile[i]“; ?> Peter Sobe Internettechnologien 20 Beispiel für einen POST-Request Methodenaufrufe zur Zusammenstellung des Requests req.open(“POST“, “dateiname.php?“, …); req.setRequestHeader(“Content-Type“, “applicatio/x-www-form-urlencoded“); req.send(“x=1&y=3&z=5“); Parameterauswertung im PHP-Skript: Ein POST-Request … sendet die <?php übergebenen Daten $x=0; $y=0; $z=1; mit dem Body-Block. if (isset($_POST[“x“]) $x=$_POST[“x“]; if (isset($_POST[“y“]) $y=$_POST[“y“]; if (isset($_POST[“z“]) $z=$_POST[“z“]; $erg=($x + $y) * $z ; echo “ ($x + $y) * $z ergibt $erg \n“; … Peter Sobe Internettechnologien 21 AJAX Beispiel (1) Ein AJAX-“Taschen“-Rechner … <head> <title>JavaScript und HTTP</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <script src=“ajaxrechner.js" type="text/javascript"></script> </head> <body> <form> <input type="text" name="a" /> <select name="o"> <option value="p">+</option> <option value="-">-</option> <option value="*">*</option> <option value="/">/</option> </select> Beispiel aus: J. Gamperl: AJAX- Web2.0 in der Praxis, Galileo Press, 2006 Peter Sobe Internettechnologien 22 AJAX Beispiel (2) Ein AJAX-“Taschen“-Rechner (Fortsetzung) … <input type="text" name="b" /> <input type="button" value=" = " onclick=" ajaxRechner(this.form)" /> <input type="text" name="ergebnis" /> </form> </body> </html> Javascript (in eigenständiger Datei “ajaxrechner.js“) … Peter Sobe Internettechnologien 23 AJAX Beispiel (2) var ajaxRechner = function(f) { var query = "a="+escape(f.a.value)+"&"+ "b="+escape(f.b.value)+"&"+ "o="+escape(f.o.options[f.o.selectedIndex].value); var xmlhttp = new ajaxRequest( "rechner.php", function() { var r = xmlhttp.req; if (r.readyState==4) { f.ergebnis.value = (r.status == 200) ? r.responseText : "ERROR"; } }, "POST", query, ["Content-Type","application/x-www-form-urlencoded"] ); xmlhttp.doRequest(); } Peter Sobe Internettechnologien 24 AJAX Beispiel (3) Klasse ajaxRequest: ajaxRequest = function(u,f,m,b,h,s) { this.url = u; this.wState = f || function() { }; this.method = m || "GET"; this.body = b || null; this.headers = h || false; this.sync = s || true; this.abortReq = false; this.req = (window.XMLHttpRequest) ? new XMLHttpRequest() : ((window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : false ); … Peter Sobe Internettechnologien 25 AJAX Beispiel (4) Klasse ajaxRequest (Fortsetzung) this.doRequest = function() { this.req.open(this.method,this.url,this.sync); if (this.headers) { for (var i=0; i<this.headers.length; i+=2) { this.req.setRequestHeader(this.headers[i],this.headers[i+1]); } } this.req.onreadystatechange = this.wState; (!this.abortReq) ? this.req.send(this.body) : this.req.abort(); } } Peter Sobe Internettechnologien 26 AJAX Beispiel (5) Rechner.php: <?php if ( $_POST["a"]!="" && $_POST["b"]!="" ) { $a = $_POST["a"]; $b = $_POST["b"]; switch ($_POST["o"]) { case "p": print $a+$b; break; case "-": print $a-$b; break; case "*": print $a*$b; break; case "/": print $a/$b; break; } } else print "FALSCHER INPUT"; ?> Peter Sobe Internettechnologien 27 Wiederholung: Asynchrone Natur von XMLHttpRequest Zeit Web-Client result = req.responseText; var req = new XMLHttpRequest; req.open(“POST“,“ziel.php“); req.send(“name=Meier&kontonr=“4711815“); Ajax-Engine HTTP-ProtokollNachrichten Web-Server Peter Sobe Internettechnologien 28 Wiederholung: Zustände von XMLHttpRequest var req = new XMLHttpRequest; 0 unitialized req.open(“POST“,“ziel.php“); 1 loading Client-Script: Zusammenstellen des Requests req.send(“name=Meier&kontonr=“4711815“); 2 loaded Client-Script: ggf. Abbrechen, optional kann eine Fortschrittsanzeige durch zeitgesteuerte Funktionen erfolgen Server-Antwort begonnen 3 interactive Server-Antwort beendet Client-Script: Verarbeiten der Antwort, bzw. Fehlerbehandlung Peter Sobe 4 complete Internettechnologien 29 Übertragung von Text vs. XML Bisher zwei Möglichkeiten zur Datenübertragung mit dem XMLHttpRequest Anfordern von Daten und Rückgabe als responseText als reponseXML Übertragen von Daten als url-encoded Text mit einen GET-Request als url-encoded String (Text) im send-body (POST Request) als XML-Datenstruktur im send-Body (POST Request) Peter Sobe Internettechnologien 30 Eingabeparameter als XML Übertragen der XML-Datenstruktur im send-Body (POST Request) var req = XMLHttpRequest; req.open(“POST“,“beispiel.php“); req.setRequestHeader(“Content-Type“,“text/xml“); req.onreadystatechange = function() { … } var namestr = encodeURI(namefeld.value); // angenommene var alterstr = encodeURI(alterfeld.value); // Formular Text-Inputs var xmlbody = “<search>“; xmlbody += “<name>“+namstr+“</name>“; xmlbody += “<alter>“+alterstr+“</alter>“; xmlbody += “</search>“; req.send(“<?xml version=‘1.0‘ encoding=‘UTF-8‘?>“+xmlbody); Peter Sobe Internettechnologien 31 Rückgabe als XML Anlegen einer Variablen zur Aufnahme des XML-Objekts var xmlobj = req.responseXML; Danach Auslesen der Elemente aus dem XML-Dokument. Das konkrete Vorgehen ist stark abhängig von der XML-Struktur. Ein einfaches Beispiel: var element = xmlobj.getElementsByTagName(‘abflug‘).item(0); var value = element.firstChild.data; Korrespondiert z.B. mit der <flugplan ort=“FRA“> empfangenen Struktur: <abflug>Moscow</abflug> <abflug>Paris</abflug> <ankunft>Stockholm</ankunft> </flugplan> Peter Sobe Internettechnologien 32 XML auf Server-Seite (1) Möglichkeit 1: Manuelles Zusammenstellen des XML-Strings mit echo und printf Anweisungen. <? $stationsmeldung = array(“ort“=>“Stavanger“, “windr“=>“Sued“, “windst“=>“4“, “wetterer“=>“Regenschauer“, “temp“=>“9“, “druck“=>“1009“ ); … echo “<stationsmeldung> \n“; while($wert=each($stationsmeldung)) { echo “<“.$wert[“key“].“>“; echo $wert[“value“]; echo “</“.$wert[“key“].“>“; } echo “</stationsmeldung> \n“; ?> Peter Sobe Internettechnologien 33 XML auf Server-Seite (2) Möglichkeit 2: Benutzen von Bibliotheksklassen,z.B. DOM-XML Methoden sind nach dem Vorbild der DOM-Funktionen von Javascript gestaltet <? $stationsmeldung = array(“ort“=>“Stavanger“, “windr“=>“Sued“, “windst“=>“4“, “wetterer“=>“Regenschauer“, “temp“=>“9“, “druck“=>“1009“ ); … $dom = domxml_new_doc(‘1.0‘, ‘utf-8‘); // Root Knoten erstellen $root = $dom->create_element('stationsmeldung'); $dom->append_child($root); … Peter Sobe Internettechnologien 34 XML auf Server-Seite (3) Möglichkeit 2 (Fortsetzung) : Bibliotheksklassen DOM-XML … while($wert=each($stationsmeldung)) { $tag_node = $dom->create_element($wert[“key“]); $root->append_child($tag_node); $tag_node->append_child( $dom->create_text_node($wert[“value“])); } // Ausgabe echo $dom->saveXML(); ?> Neben DOM-XML gibt es: DOM, libxml, SimpleXML und vermutlich noch weitere PHP Bibliotheken Peter Sobe Internettechnologien 35 Umschiffen von Cache-Problemen (1) Daten, die mehrmals per AJAX-Request angefordert werden, haben oft die gleiche URL und unterliegen damit Caching. Cache des Browsers Cache in Proxy-Servern Es wird veralteter Inhalt zurückgegeben, wenn die Daten serverseitig aktualisiert werden. Gegenmittel auf Client-Seite: Setzen zusätzlicher Request-Header: req.setRequestHeader(“Pragma“,“no-cache“); req.setRequestHeader(“Cache-Control“,“must-revalidate“); oder Anhängen zusätzlicher Dummy-Parameter: var zusatz = new Date().getTime(); req.open(“GET“,“beispiel.php“+zusatz); Peter Sobe Internettechnologien 36 Umschiffen von Cache-Problemen (2) Gegenmittel auf Server-Seite: Setzen zusätzlicher Response-Header: <?php header(“Pragma“,“no-cache“); header(“Cache-Control: no-store, no-cache, must-revalidate“); header(“Cache-Control: post-check=0, pre-check=0, false“); oder Setzen eines Cache-Verfallsdatums auf ein früheres Datum: header(“Expires: Tue, 27. Jul 1997 06:00:00 GMT “); header(“Last-Modified: “.gmdate(“D, d M Y H:i:s“).“ GMT“); Peter Sobe Internettechnologien 37 JSON – Übertragungsmodell (1) JSON - JavaScript Object Notation Übertragung von speziell kodierten Strings anstatt XML Strings werten als Text übertragen (z.B. req.responseText) Für das Senden via JSON verpackt der Client die Datenstrukturen (bzw. Objekte) in diese Strings. Das geschieht mittels bereitgestellter Bibliotheksfunktionen. Bei Javascript entstehen s.g. Literalobjekte Client entnimmt Daten und baut Datenstrukturen (bzw. Objekte) wieder auf. Die Auswertung auf Client-Seite erfolgt mittels Bibliotheksfunktionen und erzeugt wiederum solche Literalobjekte. Server (z.B. PHP-Skript) kann Datenstrukturen in JSONStrings kodieren und als Ausgabe eines HTTP-Requests bereitstellen. Dazu gibt es in PHP entsprechende Bibliotheksfunktionen. Peter Sobe Internettechnologien 38 JSON – Übertragungsmodell (2) Beispiel: ein AJAX-Client sendet eine Übersetzungsanfrage per GET mit dem zu übersetzenden Wort als Parameter: Client / Javascript: $word = “funicular“ req.open(“GET“,“server.php?translate=“+$word,true); req.send(); Server / PHP: <?php require_once(“json.php“); $word = $_GET[‘translate‘]; // some magic translation algorithm $german = “seilbahn“; $spanish=“el funicular“; $french=“funiculaire“; $result = array (“g“=>$german, “s“=>$spanish, “f“=>$french); $json = new Services_JSON(); echo $json->encode($result); ?> Peter Sobe Internettechnologien 39 JSON – Übertragungsmodell (3) Beispiel (Fortsetzung) Client / Javascript: in der onreadystatechange-Funktion if (req.readystate==4) { if (req.status==200) { var translation = eval ( ‘(‘+req.responseText+‘)‘ ); d_german.innerHTML= translation.g; d_french.innerHTML= translation.f; d_spanish.innerHTML= translation.s; } else { d_german.innerHTML= “Translation Error“; d_french.innerHTML= “Translation Error“; d_spanish.innerHTML= “Translation Error“; } } Peter Sobe Internettechnologien 40 JSON – Übertragungsmodell (4) Übertragungsformat des Beispiels: {“g“: “seilbahn“,“s“:“el funicular“,“f“:“funiculaire“} Im Beispiel wurde ein assoziatives Array kodiert. Ein anderes Beispiel ist ein 2-dimensionales Array innerhalb des Clients: innere Dimension als assoziatives Array, äußere Dimension als numerisches Array. var warenkorb = { “items“: [ {id:1, titel:“Schokolade“, preis:“1.05“waehrung:“EUR“ }, {id:2, titel:“Gummibaeren“, preis:“1.99“, waehrung:“CHF“}, {id:3, titel:“Mandeltorte “, preis:“29.95“, waehrung:“SKR“ } ] }; … JSON.stringify(warenkorb); Peter Sobe Internettechnologien 41 JSON – Übertragungsmodell (5) … var json_string = JSON.stringify(warenkorb); Danach sieht der String wie folgt aus: {"items":[{"id":1,"titel":„schokolade","preis":1.05,„waehrung":"EUR"},{"id":2,"tit el":„Gummibaeren","preis":1.99,"current":“CHF"},{"id":3,"titel":“Mandeltorte"," preis":19.95,"current":“SKR"}]} Dieser String könnte nun zum Server übertragen und dort gespeichert werden. Wird der String später wieder zum Client gesendet, kann er wie folgt wieder in die originale Datenstruktur gewandelt werden: var warenkorb= JSON.parse(receivedText); Alternativ kann man auch verwenden: var warenkorb= eval(‘(‘+receivedText+‘)‘); Peter Sobe Internettechnologien 42 AJAX - Zusammenfassung HTTP-Interaktion durch Klasse XMLHttpRequest im JavascriptTeil einer Webanwendung Laden und Übertragen von Webinhalten damit losgelöst von WebBrowser Bedienung Client Seite: Javascript Server Seite: normaler HTTP-Server + XML Dateien + PHP oder anderer Skriptsprachen Peter Sobe Internettechnologien 43