Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 <<   zurück
JavaScript und AJAX von Christian Wenz
Das umfassende Handbuch
Buch: JavaScript und AJAX

JavaScript und AJAX
839 S., mit DVD, 39,90 Euro
Galileo Computing
ISBN 3-89842-859-1
gp Kapitel 20 Web Services
  gp 20.1 Was sind Web Services?
    gp 20.1.1 Verteiltes Arbeiten
    gp 20.1.2 WSDL
    gp 20.1.3 Web Services aufrufen
  gp 20.2 Web Services mit JScript.NET
    gp 20.2.1 Installation
    gp 20.2.2 Programmierung
  gp 20.3 Mit dem Internet Explorer auf Web Services zugreifen
  gp 20.4 Mit Mozilla auf Web Services zugreifen


Galileo Computing

20.4 Mit Mozilla auf Web Services zugreifen  toptop

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 Privilegien 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.

Abbildung
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:

gp  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).
gp  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:

gp  antwort.body.firstChild ist das Element <istPrimzahlResponse>.
gp  antwort.body.firstChild.firstChild ist das Element <istPrimzahlResult>.
gp  antwort.body.firstChild.firstChild.firstChild ist der Text-inhalt des Elements <istPrimzahlResult>.
gp  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>

Abbildung
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
  
  Zum Katalog
Zum Katalog: JavaScript und AJAX
JavaScript und AJAX
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: JavaScript und AJAX - Das Video-Training






 JavaScript und AJAX -
 Das Video-Training


Zum Katalog: Webseiten programmieren und gestalten






 Webseiten
 programmieren
 und gestalten


Zum Katalog: XHTML, HTML und CSS






 XHTML, HTML und CSS


Zum Katalog: CSS-Praxis






 CSS-Praxis


Zum Katalog: AJAX






 AJAX


Zum Katalog: PHP 5 und MySQL 5






 PHP 5 und MySQL 5


Zum Katalog: TYPO3 4.0






 TYPO3 4.0


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




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