Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einleitung
2 Webbrowser
3 JavaScript einbauen
4 Programmieren mit JavaScript
5 Datum
6 Zufall
7 Browserinformationen
8 Fenster
9 Formulare
10 Frames und Iframes
11 Grafiken
12 Cookies
13 Objekte und Arrays
14 Ereignisbehandlung
15 Fehlerbehandlung
16 DOM
17 DHTML und CSS
18 AJAX
19 XML
20 Web Services
21 AJAX-Frameworks
22 Plugins
23 Multimedia
24 Java
25 Serverseitige Technologien
26 JavaScript goes .NET
27 Code schützen
28 Top Secret: Passwortschutz
29 Signierte Skripte
30 JavaScript und Sicherheit
31 Navigation
32 Warenkorb
33 JavaScript-Bibliotheken
34 Referenz
35 Quellen im Web
36 Die Zukunft von JavaScript
Index
Download: - ZIP, ca. 9,2 MB
Buch bestellen
Ihre Meinung?
<< zurück | Galileo Computing / <openbook> / JavaScript und AJAX | vor >>
JavaScript und AJAX von Christian Wenz Das umfassende Handbuch
JavaScript und AJAX 839 S., mit DVD, 39,90 Euro Galileo Computing ISBN 3-89842-859-1 |
| Kapitel 20 Web Services
|  | 20.1 Was sind Web Services?
|  |  | 20.1.1 Verteiltes Arbeiten
|  |  | 20.1.2 WSDL
|  |  | 20.1.3 Web Services aufrufen
|  | 20.2 Web Services mit JScript.NET
|  |  | 20.2.1 Installation
|  |  | 20.2.2 Programmierung
|  | 20.3 Mit dem Internet Explorer auf Web Services zugreifen
|  | 20.4 Mit Mozilla auf Web Services zugreifen
## 20.4 Mit Mozilla auf Web Services zugreifen Der Mozilla-Browser unterstützt ab Version 0.9.9 auch den Zugriff auf Web Services. Unter der URL http://lxr.mozilla.org/seamonkey/source /extensions/xmlextras/docs/Soap_Scripts_in_Mozilla.html finden Sie weitere Informationen und Links auf Beispieldateien. Die Versionsnummer des Mozilla-Kerns eines Browsers wie etwa Netscape oder Firefox oder Camino erhalten Sie, indem Sie die Pseudo-URL about: aufrufen und einen genaueren Blick auf die Versionsbezeichnung werfen. Beim Firefox 1.5.0.6 beispielsweise ist das Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6): Diese Browserversion basiert also auf Mozilla 1.8.0.6. Im Folgenden sehen Sie, wie Sie von Mozilla aus den .NET Web Service aufrufen können. Seien Sie aber gewarnt: Die SOAP-Erweiterung hat noch einige Macken. Für die Zukunft sind Erweiterungen angekündigt, es kann also gut sein, dass sich etwas ändern wird. Der erste Schritt besteht darin, zunächst vom Benutzer erweiterte Privile gien für den Webbrowser anzufordern; in Kapitel 29 erfahren Sie mehr Details dazu:
    netscape.security.PrivilegeManager.enablePrivilege(
       "UniversalBrowserRead");
Mozilla-Browser haben die Angewohnheit, dass das Gewähren zusätzlicher Rechte oft nur funktioniert, wenn die URL per Filesystem aufgerufen wird, also als c:\datei.html oder ~/datei.html; bei einem Zugriff per Webserver funktioniert das standardmäßig nicht. Im Webbrowser erscheint dann ein Warnfenster, das dem Benutzer ermöglicht, die erweiterten Rechte zu gewähren oder sie zu verweigern. Hier klicken, um das Bild zu Vergrößern Abbildung 20.10 Die erweiterten Rechte werden angefordert. Um einen Web Service per SOAP aufzurufen, müssen Sie ein SOAPCall-Objekt erstellen.
    var s = new SOAPCall();
Dann müssen Sie zwei Eigenschaften des Objekts setzen:
| transportURI – Diese Eigenschaft enthält die Adresse des Web Service, bei uns also "http://localhost/Primzahlen.asmx" (beziehungsweise diejenige URL, unter der Sie den Web Service erreichen – der interne Webserver des VWD läuft unter einer zufälligen Portnummer).
| actionURI – ist die Methode, die aufgerufen werden soll. Bei uns ist dies "http://tempuri.org/istPrimzahl". Anstelle von http://tempuri.org/ geben Sie normalerweise den Server an, auf dem der Webservice schließlich liegt. Wenn Sie dies nicht tun (wie wir in unserem Beispiel), wird als Standardwert http://www.tempuri.org/ angegeben.
Im Code sieht das dann folgendermaßen aus:
    s.transportURI = "http://localhost/Primzahlen.asmx";
    s.actionURI = "http://tempuri.org/istPrimzahl";
Unser Web Service erwartet einen Parameter namens "zahl". Dazu müssen Sie ein SOAPParameter-Objekt erstellen. In der Eigenschaft name steht der Name, in value der Wert:
    var p = new SOAPParameter();
    p.name = "zahl";
    p.value = 1007;
An dieser Stelle ergibt sich ein kleines Problem: .NET Web Services verwenden einen anderen Namespace für XML Schema als Mozilla – noch, denn ein Bug-Report ist eingereicht (und in neueren Versionen funktioniert der Aufruf ohne den folgenden Workaround). Um hier Kompatibilität zu schaffen, müssen Sie diesen Namespace einbinden:
    var enc = new SOAPncoding();
    enc = enc.getAssociatedEncoding(
       "http://schemas.xmlsoap.org/soap/encoding/", false);
    s.encoding = enc;
    var coll = enc.schemaCollection;
    var typ = coll.getType(
       "integer", "http://www.w3.org/2001/XMLSchema");
    if (typ) {
       p.schemaType = typ;
    }
Nun muss aus den gesamten Angaben ein SOAP-Aufruf generiert werden. Dazu wird die Methode s des SOAPCall-Objekts verwendet. Diese erwartet nicht weniger als sieben Parameter:
1. | die zu verwendende Versionsnummer – diese setzen Sie hier auf 0.
2. | die Methode, die aufgerufen werden soll – bei uns ist das "istPrimzahl".
3. | der Zielserver, hier "http://tempuri.org/".
4. | die Anzahl der SOAP-Header-Elemente (bei uns: 0) .
5. | ein Array aus Header-Elementen. Da wir keine Header-Elemente angeben, müssen Sie hier null angeben.
6. | die Anzahl der Parameter im SOAP-Aufruf (hier: 1) .
7. | ein Array aus Parametern. Obwohl wir nur einen Parameter haben, müssen Sie ein Array erstellen: new Array(p) oder [p].
Der komplette Aufruf sieht wie folgt aus:
    s.encode(
       0,
       "istPrimzahl",
       "http://tempuri.org/",
       0,
       null,
       1,
       new Array(p));
Im letzten Schritt muss der SOAP-Aufruf nur noch abgeschickt werden. Wir gehen auch hier wieder asynchron vor und warten nicht auf das Ergebnis des SOAP-Aufrufs, sondern geben an, dass eine Funktion beim Eintreffen der SOAP-Antwort ausgeführt werden soll:
    var aufruf = s.asyncInvoke(ergebnis);
Die Funktion ergebnis() kommt also zur Ausführung, sobald der Web Service eine Antwort an den Client liefert. Dabei werden automatisch drei Parameter überliefert: die SOAP-Antwort, der ursprüngliche SOAP-Aufruf sowie ein Status-Code (0, falls kein Fehler aufgetreten ist). Über die Eigenschaft fault der Antwort können Sie ebenfalls feststellen, ob ein Fehler aufgetreten ist:
    if (antwort.fault){
       alert("Es ist ein Fehler aufgetreten!");
    }
Falls kein Fehler aufgetreten ist, muss das Ergebnis aus der SOAP-Antwort extrahiert werden. Werfen wir einmal einen Blick auf solch eine Antwort; Sie erhalten sie übrigens über antwort.message als DOM-Objekt:
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body>
    <istPrimzahlResponse xmlns="http://tempuri.org/">
    <istPrimzahlResult>true</istPrimzahlResult>
    </istPrimzahlResponse></soap:Body></soap:Envelope>
Über antwort.body erhalten Sie nur das <soap:Body>-Element. Da ist die Handhabung etwas einfacher:
    <soap:Body><istPrimzahlResponse
    xmlns="http://tempuri.org/"><istPrimzahlResult>true
    </istPrimzahlResult>
    </istPrimzahlResponse></soap:Body>
Nun ist es an der Zeit, das DOM-Wissen aus Kapitel 16 einzusetzen:
| antwort.body.firstChild ist das Element <istPrimzahlResponse>.
| antwort.body.firstChild.firstChild ist das Element <istPrimzahlResult>.
| antwort.body.firstChild.firstChild.firstChild ist der Text-inhalt des Elements <istPrimzahlResult>.
| antwort.body.firstChild.firstChild.firstChild.data ist der Text, der in <istPrimzahlResult> steht.
Sie erhalten also die Antwort des Web Service, ob eine Primzahl vorliegt, über antwort.body.firstChild.firstChild.firstChild.data. Beachten Sie, dass hier kein boolescher Wert vorliegt, sondern ein String: "true" oder "false". Wenn wir all diese Elemente zusammentragen, können wir ein Listing erzeugen, das in Anlehnung an das Beispiel mit dem Internet Explorer den Web Service aufruft und das Ergebnis ausgibt. Beachten Sie, dass Sie im Mozilla-Browser auf DOM-Methoden setzen müssen; beispielsweise setzen Sie den Textinhalt in einem <p>-Element über document.getElementById("...").firstChild.data.
    <html>
    <head>
    <title>Web Service</title>
    <script type="text/javascript"><!--
    function check(wert) {
       document.getElementById("ausgabe").firstChild.data =
          "Bitte warten ...";
       netscape.security.PrivilegeManager.enablePrivilege(
          "UniversalBrowserRead");
       var s = new SOAPCall();
       s.transportURI = "http://localhost/Primzahlen.asmx";
       s.actionURI = "http://tempuri.org/istPrimzahl";

       var p = new SOAPParameter();
       p.name = "zahl";
       p.value = parseInt(wert);

       var enc = new SOAPEncoding();

       enc = enc.getAssociatedEncoding(
          "http://schemas.xmlsoap.org/soap/encoding/", false);
       s.encoding = enc;
       var coll = enc.schemaCollection;
       var typ = coll.getType(
          "integer", "http://www.w3.org/2001/XMLSchema");
       if (typ) {
          p.schemaType = typ;
       }

       s.encode(
          0,
          "istPrimzahl",
          "http://tempuri.org/",
          0,
          null,
          1,
          new Array(p));
       var aufruf = s.asyncInvoke(ergebnis);
    }

    function ergebnis(antwort, aufruf, status) {
       if (antwort.fault) {
          document.getElementById("ausgabe").
          firstChild.data =
             "Fehler!";
       } else {
          document.getElementById("ausgabe").
          firstChild.data =
            (antwort.body.firstChild.firstChild.firstChild.data
               == "true") ? "" : "k";
          document.getElementById("ausgabe").firstChild.data +=
             "eine Primzahl";
       }
    }
    //--></script>
    </head>
    <body>
    <form>
       Bitte Zahl eingeben:
       <input type="text" name="zahl" id="zahl" size="5" />
       <input type="button" value="Prüfen"
          onclick="check(document.getElementById('zahl').value);" />
    </form>
    <p id="ausgabe">---</p>
    </body>
    </html>
Hier klicken, um das Bild zu Vergrößern Abbildung 20.11 1007 ist also keine Primzahl (sondern 19 mal 53). Im letzten Schritt sollten Sie natürlich diese beiden Ansätze noch zusammenbringen, den Browsertyp ermitteln und je nachdem den Ansatz von Mozilla oder von Microsoft wählen. In der Regel aber fahren Sie besser, wenn Sie auf AJAX setzen und JSON als Datenaustauschformat verwenden, denn das ist deutlich einfacher und weniger fehlerträchtig und vor allem browserunabhängig als die in diesem Kapitel gezeigten Web-Services-Lösungen. 1 Im Jahre 1995 gab die Gesellschaft für deutsche Sprache e. V. »Multimedia« den Vorzug vor Begriffen wie »Kruzifixurteil«, »Anklicken«, »Datenautobahn« und »Rechtschreibreform« (Quelle: http://www.gfds.de/woerter.html). Eine Primzahl ist definiert als Zahl, die nur zwei Teiler hat: die 1 und die Zahl selbst. Deswegen ist 1 keine Primzahl, denn 1 hat nur einen Teiler (sich selbst).
<< zurück | <top> | vor >>
Zum Katalog
JavaScript und AJAX bestellen
Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen? Ihre Meinung
Buchtipps
| JavaScript und AJAX - Das Video-Training
| Webseiten programmieren und gestalten
| XHTML, HTML und CSS
| CSS-Praxis
| AJAX
| PHP 5 und MySQL 5
| TYPO3 4.0
Shopping
Versandkostenfrei bestellen in Deutschland und Österreich Info

Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

[Galileo Computing]
Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de