Anzeige
Tutorialbeschreibung

Javascript und Ajax - Web Services

Javascript und Ajax - Web Services


Dieses Kapitel behandelt  Web Services. Sie sehen, worum es sich hierbei überhaupt handelt und wie Sie mit JavaScript darauf zugreifen können.

 


Das nun folgende Tutorial ist ein Auszug aus dem Buch: Professionelle Websites von Stefan Münz.
Die Veröffentlichung des Kapitels erfolgt mit freundlicher Genehmigung von Pearson Education.

Die Dienste der Großen sind gefährlich und lohnen der Mühe nicht, die sie kosten. – Gotthold E. Lessing Es ist der Erfolg, der die großen Männer macht. – Napoleon Bonaparte

Kapitel 20 Web Services

Es scheint ein ungeschriebenes Gesetz in der IT-Branche zu sein, dass es jedes Jahr ein Hype-Thema gibt. In den letzten Jahren waren das so wohlklingende Begriffe wie »Multimedia«, »WAP« oder »XML«. Auch die Zyklen, die die entsprechenden Technologien durchlaufen, ähneln sich. Zunächst wird das Thema hochgejubelt, und jeder Wanderprediger preist die neue technische Wunderwelt. Bremser, die unangenehme Fragen der Art »Wo ist der Nutzen für die breite Masse?« oder »Wo sind die Praxisanwendungen?« stellen, werden niederdiskutiert. Im schlimmsten Fall ist sogar ein neues »Wort des Jahres« geboren.Dabei ist es egal, ob es sich um eine Programmiersprache, eine Technik oder ein Betriebssystem handelt; das Muster ist immer dasselbe. Nun gut, die lauten Stimmen bekommen nach und nach prominenten Widerspruch. Mehr und mehr zuvor fanatische Verteidiger rücken von ihrer Einstellung ab, einige sehen ihre vorschnelle Begeisterung für ein noch unreifes Thema ein, andere handeln so wider besseres Wissen, um ihre Pfründe zu retten. Nach und nach ebbt der Hype ab, und die IT-Welt kehrt wieder zur Normalität zurück.

Sobald sich der Nebel jedoch gelichtet hat, fangen einige kluge Köpfe an, das Konzept noch einmal zu betrachten, entwerfen Lösungen, stellen Machbarkeitsstudien an und entwickeln die Technologie weiter. Oftmals wird dann erneut versucht, die Technik einer breiteren Masse zugänglich und schmackhaft zu machen. Und manchmal klappt das sogar. Das beste Beispiel hierfür ist XML. Jeder, der vor ein paar Jahren etwas auf sich hielt, war ein selbst ernannter XML-Experte. Erfolgreich durchgeführte Projekte konnte jedoch fast niemand vorweisen. Heutzutage ist XML überall zu finden, das Format ist schon etabliert und weiter auf dem Vormarsch. Und die Moral von der Geschicht´ – respektive von dieser längeren Kapiteleinleitung: Springen Sie nicht auf jeden Zug auf, der gerade vorbeifährt!

Aber: Sehen Sie ihn sich zunächst einmal an – es könnte ja sein, dass Sie später noch einsteigen möchten.

Dieses Kapitel behandelt ein Thema, das seit Längerem ebenfalls ziemlich hochgejubelt wird, sich aber beständig hält und damit gute Zukunftsaussichten hat – Web Services. Sie sehen, worum es sich hierbei überhaupt handelt und wie Sie mit JavaScript auf solche Web Services zugreifen können. Betrachten Sie Web Services vor allem mit AJAX und JSON im Hinterkopf, welche manchmal die bessere (und ebenfalls gehypte) Wahl sind.


 

 

20.1 Was sind Web Services?  

Was aber ist nun so ein Web Service? Nun, Web Services gibt es eigentlich schon seit mehreren Jahren. In letzter Zeit jedoch ist das Thema sehr populär geworden. Ein Grund dafür ist die Firma Microsoft beziehungsweise ihre .NET-Strategie, denn ein Teil dieser Strategie sind auch Web Services. Das Thema .NET hat derart weite Kreise gezogen, dass mittlerweile sogar an Open-Source-Implementierungen gearbeitet wird. Wir wollen in diesem doch sehr plattformneutralen Buch die Anti-Microsoft-Fraktion nicht über Gebühr strapazieren, weswegen wir .NET größtenteils außen vor lassen (und an den Stellen, an denen wir es trotzdem behandeln, begründen wir das ausführlich).


 

 

20.1.1 Verteiltes Arbeiten 

Aber zurück zum Thema Web Services: Eines der wichtigen Schlagwörter heißt »Distributed Computing« oder »verteilte Anwendungen«. Es geht darum, Teile einer Anwendung auch auf anderen Rechnern laufen zu lassen. Dazu gab es früher schon Ansätze, beispielsweise DCOM (Distributed Component Object Model). Die zunehmende Verbreitung des Internets hat jedoch dazu geführt, dass nach neuen Möglichkeiten gesucht wurde, verteilte Anwendungen zu organisieren – am besten unter Verwendung von Internetprotokollen.

Mit Hilfe von Web Services können einzelne Webapplikationen miteinander kommunizieren. Das Trägerprotokoll ist http, denn dieses Protokoll ist bereits überall im Internet in irgendeiner Form implementiert. Als weitere Technik kommt XML (eXtensible Markup Language) zum Einsatz. Die Daten bei Web Services werden im XML-Format übergeben, denn es bietet eine standardisierte Möglichkeit, Daten zu speichern.

Die einzelnen Daten, die bei einem Web Service hin- und hergeschickt werden, sind im SOAP-Format gespeichert. SOAP stand einst für »Simple Object Access Protocol«, ist jedoch weder simpel noch hat es etwas mit Objektzugriff zu tun, und ein Protokoll im eigentlichen Sinne des Begriffs ist es auch nicht. Deswegen steht SOAP mittlerweile nur noch für ... SOAP. Aber zurück zum Thema: SOAP ist eine Vorschrift, die angibt, wie die einzelnen Daten verpackt werden müssen. Als Beschreibungssprache innerhalb einer SOAP-Nachricht wird übrigens – wen wundert's – XML eingesetzt.

Sie müssen sich das Vorgehen folgendermaßen vorstellen: Angenommen, Sie benötigen eine Information, beispielsweise die aktuelle Uhrzeit (atomgenau), den Börsenkurs einer Firma oder darüber, ob es von dem JavaScript-Buch bereits eine neue Auflage gibt. Sie schicken dann eine SOAP-Nachricht an einen Web Service und rufen dort die gewünschte Funktionalität ab. Der Web Service antwortet auch (mehr oder weniger) prompt und schickt Ihnen das Ergebnis zurück, ebenfalls per SOAP.

In diesem Kapitel werden wir als durchgängiges Beispiel etwas Einfacheres verwenden. Wir überprüfen per Web Service, ob eine Zahl eine Primzahl ist oder nicht. Sie sehen später, warum wir ausgerechnet dieses Beispiel ausgewählt haben.


 

 

20.1.2 WSDL 

Ein Web Service erwartet gewisse Parameter, die an ihn übergeben werden (im Primzahltest beispielsweise die Zahl, die überprüft werden soll). Außerdem ist der Rückgabewert eines Web Service ebenfalls von einem bestimmten Wert. Damit ein Programm oder ein Skript, das auf einen Web Service zugreifen will, weiß, welche Parameter erwartet werden und welche zurückgeliefert werden, muss es eine Art von Beschreibung des Dienstes geben. Diese wird in WSDL zurückgeliefert. Das Kürzel WSDL steht für »Web Services Description Language« und gibt (natürlich als XML) eine Beschreibung des Web Service zurück. Hier sehen Sie einen Auszug aus einer Beschreibung für den (momentan noch nicht vorhandenen) Primzahlen-Web-Service:

<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:s="http://www.w3.org/2001/XMLSchema" 
xmlns:s0="http://tempuri.org/" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" 
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
targetNamespace="http://tempuri.org/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
   <types>
      <s:schema elementFormDefault="qualified"
         targetNamespace="http://tempuri.org/">
         <s:element name="istPrimzahl">
            <s:complexType>
               <s:sequence>
                  <s:element minOccurs="1" maxOccurs="1"
                              name="zahl" type="s:int" />
               </s:sequence>
            </s:complexType>
         </s:element>
         <s:element name="istPrimzahlResponse">
            <s:complexType>
               <s:sequence>
                  <s:element minOccurs="1" maxOccurs="1"
                     name="istPrimzahlResult"
                     type="s:boolean" />
               </s:sequence>
            </s:complexType>
         </s:element>
         <s:element name="boolean" type="s:boolean" />
     </s:schema>
  </types>
</definitions>

Diese Beschreibung sagt unter anderem aus, dass es einen Dienst namens istPrimzahl gibt.

<s:element name="istPrimzahl">

Es wird genau ein Parameter erwartet, der vom Typ int (für Integer) ist:

<s:element minOccurs="1" maxOccurs="1" name="zahl" type="s:int" />

Der Rückgabewert des Dienstes ist ein boolescher Wert:

<s:element name="istPrimzahlResponse">
   <s:complexType>
      <s:sequence>
         <s:element minOccurs="1" maxOccurs="1"
            name="istPrimzahlResult" type="s:boolean" />
      </s:sequence>
   </s:complexType>
</s:element>


 

 

20.1.3 Web Services aufrufen  

Es gibt mehrere Möglichkeiten, einen Web Service aufzurufen. SOAP haben wir ja bereits zuvor erwähnt. Hier folgt eine etwas ausführlichere Schilderung.

Bei der Verwendung von SOAP muss eine HTTP-Anforderung an den Web Service übermittelt werden. Eine HTTP-Anforderung besteht aus einem HTTP-Header und (optional) dem eigentlichen Inhalt. Zwischen dem Header und dem Inhalt ist immer eine Leerzeile.

Der HTTP-Header einer SOAP-Web-Service-Anforderung sieht etwa folgendermaßen aus:

POST /Primzahlen HTTP/1.1
Host: servername
Content-Type: text/xml; charset=utf-8
Content-Length: 349
SOAPAction: "http://servername/Primzahlen/istPrimzahl"

Darauf folgen eine Leerzeile und dann der eigentliche Inhalt. Dort wird zunächst ein <soap:Envelope>-Element erstellt. Dieses dient als »Umschlag« (die deutsche Übersetzung des englischen envelope) für die eigentliche SOAP-Nachricht. Die Daten selbst stehen innerhalb des Elements <soap:Body>. Da der Web Service istPrimzahl heißt, wird ein Element <istPrimzahl> verwendet. Dort wird der Parameter angegeben. Der Name des Parameters ist zahl, also heißt das entsprechende Element <zahl>.

Wenn Sie das alles zusammenfassen, erhalten Sie als Inhalt der HTTP-Anforderung Folgendes:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <istPrimzahl xmlns="http://servername/">
         <zahl>1021</zahl>
      </istPrimzahl>
   </soap:Body>
</soap:Envelope>

Alternativ ist es möglich, den Aufruf eines Web Service per GET oder POST zu realisieren. Der Grund ist naheliegend. SOAP hat unbestritten Vorteile. In vielen Umgebungen sind jedoch GET und POST bereits implementiert, beispielsweise im Webbrowser. Insbesondere GET ist sehr einfach zu erreichen, indem die notwendigen Daten einfach per URL angegeben werden. Der (noch fiktive) Primzahl-Web-Service könnte also wie folgt aufgerufen werden:

http://servername/Primzahlen/istPrimzahl?zahl=1021

Wie Sie in dem WSDL-Ausschnitt des vorigen Absatzes sehen können, hat der Parameter, der an den Web Service übergeben wird, den Namen zahl. Obiger Aufruf würde also den Web Service veranlassen zu überprüfen, ob 1021 eine Primzahl ist oder nicht.

Die HTTP-Anforderung würde hierbei folgendermaßen aussehen:

GET /Primzahlen/istPrimzahl?zahl=1021 HTTP/1.1
Host: servername

Wenn Sie POST verwenden, sieht Ihre HTTP-Anforderung in etwa wie folgt aus:

POST /Primzahlen/istPrimzahl HTTP/1.1
Host: servername
Content-Type: application/x-www-form-urlencoded
Content-Length: 9

 

zahl=1021

Der Parameter wird also als Name-Wert-Paar im Inhalt der HTTP-Anforderung übermittelt; zwischen dem HTTP-Header und dem HTTP-Inhalt steht eine Leerzeile als Trennzeichen.

Wie die Antwort des Web Service aussieht, hängt von der verwendeten Aufrufmethode, also SOAP, GET oder POST ab. Bei den beiden letzteren Möglichkeiten, GET oder POST, ist die Antwort ein einfaches XML-Dokument, das den Rückgabewert enthält:

<?xml version="1.0" encoding="utf-8"?>
<boolean xmlns="http://servername/">true</boolean>

Bei SOAP sieht das schon anders aus; hier ist auch der Rückgabewert vollständig SOAP, also inklusive <soap:Envelope> und <soap:Body>:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <istPrimzahlResponse xmlns="http://servername/">
         <istPrimzahlResult>true</istPrimzahlResult>
      </istPrimzahlResponse>
   </soap:Body>
</soap:Envelope>

Sie sehen also, wie Sie nun serverseitig Web Services implementieren können. Die SOAP-Implementierung ist hierbei die aufwändigste, aber für komplexere Web Services die flexibelste. Die Erstellung von GET- und POST-Web-Services geht etwas schneller von der Hand.

20.2 Web Services mit JScript.NET

Ich habe es bereits angedroht – ich komme noch einmal auf die .NET-Technologie von Microsoft zurück. Der Grund: Damit sind Web Services besonders einfach zu erstellen. Keine Sorge: Jede halbwegs moderne Webtechnologie bietet Web Services an, aber mit .NET ging es eben (noch) besonders fix. Außerdem unterstützt .NET eine Reihe von Programmiersprachen, unter anderem JScript (es heißt dort JScript.NET oder JScript .NET, die Microsoft-Dokumentation ist in Hinblick auf die Frage »mit oder ohne Leerzeichen?« auch nicht konsistent). Da JScript unserer Lieblingssprache JavaScript sehr ähnelt, liegt ein Einsatz von JScript (.NET) für Web Services also nahe.

Als Beispiel haben wir, wie bereits erwähnt, eine Applikation ersonnen, die überprüft, ob ein übergebener Parameter eine Primzahl ist oder nicht. Das Problem ist nämlich, dass ein Web Service erstellt werden musste, der gegebenenfalls schon an anderer Stelle in ähnlicher Form existiert. Leserinnen und Leser, die das Beispiel nicht nachstellen können (beispielsweise weil kein entsprechender Server zum Testen zur Verfügung steht), haben dann immerhin die Möglichkeit, den Web Service an einer öffentlich zugänglichen Stelle zu testen.

Das folgende Beispiel ist zwar auch im Internet verfügbar, allerdings nicht auf einem eigenen Server des Autors, weswegen nicht sichergestellt werden kann, dass das Beispiel permanent von der angegebenen Adresse abrufbar ist.


 

 

20.2.1 Installation 

Wenn Sie mit .NET arbeiten, gibt es zunächst zwei Möglichkeiten: .NET 1.x oder .NET 2.0. Die folgenden Beispiele sind mit beiden Versionen möglich. Beginnen wir mit .NET 1.x: Zunächst benötigen Sie einen Internet Information Server (IIS, das steht mittlerweile für Internet Information Services, aber »Server« ist knackiger) von Microsoft. Dieser ist Bestandteil der Betriebssysteme Windows NT Server, Windows 2000 Professional/Server/Advanced Server, Windows XP Professional, Windows 2003 Server und diverser Ausgaben von Windows Vista. Überprüfen Sie zuerst, ob der Server bereits installiert ist, ansonsten installieren Sie ihn über die Systemsteuerung (Start N Systemsteuerung N Software N Windows-Komponenten hinzufügen/entfernen) nach.


Bilder

Abbildung 20.1     Der IIS muss installiert sein.

Als Nächstes müssen Sie das .NET Framework, also die .NET-Klassenbibliothek von Microsoft, herunterladen. Unter http://www.asp.net/download.aspx haben Sie die Möglichkeit, zwischen zwei Paketen zu wählen:

gpBilder
 

Das .NET Framework Redistributable (etwa 21 MByte). Dieses Paket enthält schon alles, was Sie zur Erstellung eines Web Service benötigen.

 

gpBilder
 

Das .NET Framework SDK (etwa 131 MByte). Dieses Paket ist mehr als sechsmal so groß wie das Redistributable, enthält dafür aber unter anderem eine Unmenge an Dokumentation. Wenn es Ihre Internet-Anbindung erlaubt (oder Sie jemanden mit schneller Anbindung und CD-Brenner kennen), sollten Sie dieses Paket einsetzen.

Laden Sie nun eines der beiden Pakete herunter, und starten Sie die Installation. Sie benötigen dazu Administratorrechte. Am Ende der Installation sollten Sie unter http://msdn.microsoft.com/net noch nachsehen, ob mittlerweile ein Update zum .NET Framework erschienen ist.

Wenn Sie mit .NET 2.0 arbeiten möchten, gibt es prinzipiell ebenfalls ein Redistributable und ein Framework SDK, aber Sie sollten am besten gleich ein komplettes Entwicklerpaket installieren. Mit dem Visual Web Developer Express Edition (kurz: VWD) bietet Microsoft eine professionelle Entwicklungsumgebung (IDE) für ASP.NET-Anwendungen an, mit der Sie auch Webseiten erstellen können. Das Beste daran ist, dass Sie nicht einmal einen IIS benötigen, denn bei VWD ist bereits ein Test-Webserver dabei. Dieser Webserver erlaubt keinen Zugriff von außen, ist aber zum Testen hervorragend geeignet.

Unter http://www.microsoft.com/germany/msdn/vstudio/products/express/vwd/ erhalten Sie den Visual Web Developer, entweder als schlanken Installer (siehe Abbildung 20.2), der die restlichen Daten aus dem Web herunterlädt, oder als großes ISO-Image zum Auf-die-CD-brennen. Nach der Installation können Sie eine neue Website anlegen (siehe Abbildung 20.3) und innerhalb der Site auch einen Web Service erzeugen.


Bilder

Abbildung 20.2     Der Installer des Visual Web Developer Express Edition

Bilder

Abbildung 20.3     Die Startseite von Visual Web Developer


 

 

20.2.2 Programmierung  

Einen Web Service mit JScript.NET zu erstellen ist eine ziemlich einfache Sache. Da Web Services ein integraler Bestandteil der .NET-Strategie sind, ist viel Funktionalität vorhanden, die sich im Hintergrund um die Kommunikation mit dem Web Service kümmert; bei anderen serverseitigen Technologien müssen Sie (noch) vieles von Hand erledigen. Es ist aber zu erwarten, dass sich das mittelfristig ändern wird.

Wie bei HTML-Dokumenten auch, reicht ein einfacher Editor, um den Web Service zu erstellen. Bei Verwendung von ASP.NET 2.0 in Verbindung mit dem Visual Web Developer ist das natürlich besonders einfach: Legen Sie eine neue Datei vom Typ Webdienst an; die Dateiendung muss .asmx sein.

Zunächst müssen Sie dafür sorgen, dass Sie JScript überhaupt als Sprache verwenden dürfen. Die Standardsprache bei .NET ist nämlich Visual Basic; Sie müssen diesen Vorgabewert ändern. Außerdem müssen Sie den Compiler noch darauf hinweisen, dass es sich um einen Web Service handelt und er (also die übergeordnete Klasse, nicht die einzelne Funktion) Primzahlen heißt. Dies alles geht mit folgender Anweisung, die in der ersten Zeile des Dokuments stehen muss:

<%@ WebService Language="JScript" Class="Primzahlen" %>

Als Nächstes müssen Sie die .NET-Klassenbibliothek für Web Services importieren, damit der Compiler später die notwendige Kommunikationsfunktionalität (inklusive SOAP) automatisch hinzufügen kann:

import System.Web.Services;

Nun erstellen Sie eine Klasse für den Web Service. In der ersten Zeile haben wir der Klasse den Namen Primzahlen gegeben, weswegen diese Bezeichnung sich im Klassennamen wiederfinden muss:

public class Primzahlen extends WebService {

   // ...

}

Jetzt fehlt uns eigentlich nur noch der eigentliche Dienst: die Überprüfung, ob eine Zahl eine Primzahl ist oder nicht. Damit diese Funktion als Methode des Web Service erkannt wird, muss ihr das Attribut WebMethodAttribute vorangestellt werden.

WebMethodAttribute

function istPrimzahl(zahl:int):boolean {

   // ...

}

Sie sehen, dass bei JScript.NET Variablen typisiert sind: Das heißt, eine Variable hat einen bestimmten Typ, beispielsweise Integer (int) oder Boolean (boolean). Dieser Typ wird hinter einem Doppelpunkt nach dem Variablennamen angegeben.

Die Überprüfung, ob der übergebene Parameter eine Primzahl ist oder nicht, wird wie folgt vorgenommen: Zunächst wird überprüft, ob als Parameter eine Zahl größer als 1 übergeben worden ist. Alle Zahlen kleiner oder gleich 1 sind keine Primzahlen.

if (zahl < 2)

   return false;

Beim Aufruf des Web Service wird automatisch überprüft, ob der übergebene Wert vom erwarteten Typ ist, hier also Integer. Sie müssen daher keine zusätzliche Typüberprüfung vornehmen.

Als Nächstes wird überprüft, ob die Zahl einen weiteren Teiler außer 1 und sich selbst hat. Dazu werden alle Zahlen zwischen 2 und der Wurzel der Zahl daraufhin geprüft, ob sie als Teiler in Frage kommen. Zwar könnten auch größere Zahlen getestet werden, die Mathematik lehrt aber, dass es entweder Teiler bis zur Quadratwurzel gibt oder überhaupt keine.

for (var i=2; i<=Math.sqrt(zahl); i++) {

   if (zahl % i == 0) {

      return false;

   }

}

Wenn nach dem Durchlaufen dieser Schleife die Funktion immer noch nicht verlassen worden ist, liegt tatsächlich eine Primzahl vor: Es gibt keinen Teiler.

return true;

Sie sehen also: Besonders aufwändig war das nicht. Hier noch einmal das komplette Listing:

<%@ WebService Language="JScript" Class="Primzahlen" %>

import System.Web.Services;

 

public class Primzahlen extends WebService {

   WebMethodAttribute

   function istPrimzahl(zahl: int) : boolean {

      if (zahl < 2) {

         return false;

      }

      for (var i=2; i<=Math.sqrt(zahl); i++) {

         if (zahl % i == 0) {

            return false;

         }

      }

      return true;

   }

}

Speichern Sie diese Datei unter dem Namen Primzahlen.asmx ab. Das Hauptverzeichnis des IIS ist bei einer Standardinstallation c:inetpubwwwroot; legen Sie die Datei also in diesem Verzeichnis ab. Mit dem Visual Web Developer legen Sie die Datei einfach im Projektverzeichnis ab, da Sie dort ja keinen ISS benötigen.

Sollten Sie die Systemvoraussetzungen für diesen .NET Web Service nicht erfüllen (also beispielsweise keinen IIS besitzen), können Sie den Web Service (momentan) unter der URL http://www6.brinkster.com/wenz/Primzahlen.asmx ausprobieren. Sollte diese URL einmal nicht mehr funktionieren, gehen Sie zu http://www.xmethods.net/. Dort finden Sie eine ganze Reihe von Web Services, unter anderem auch einen Primzahltest.

Sie können den Web Service im Folgenden testen. Rufen Sie zunächst direkt die .asmx-Datei auf, indem Sie in Ihren Webbrowser die Adresse http://localhost/Primzahlen.asmx eingeben (oder in Visual Web Developer die Tastenkombination (Strg)+(F5) betätigen). Die Ausgabe sehen Sie in Abbildung 20.4. Der Web Service gibt Auskunft über sich selbst und führt die zur Verfügung stehenden Methoden auf.

Bilder

Abbildung 20.4     Die »Hauptseite« des Web Service

Wenn Sie dann auf istPrimzahl klicken, erhalten Sie zusätzliche Informationen über die Primzahlprüfung, unter anderem den oder die Parameter (siehe Abbildung 20.5). Wenn Sie in das Texteingabefeld einen Wert eingeben und auf Invoke klicken, wird der Web Service ausgeführt; das Ergebnis des Aufrufs wird in einem neuen Fenster angezeigt. Sie können dies in Abbildung 20.6 sehen.

Bilder

Abbildung 20.5     Auskunft über die Methode istPrimzahl

Bilder

Abbildung 20.6     Das Ergebnis der Überprüfung für die Zahl 1021

Aufmerksame Leser fragen sich mittlerweile vermutlich, wie das überhaupt funktionieren kann, denn wir haben ja keine WSDL-Beschreibung des Web Service erstellt. Der Grund ist einfach: Wenn Sie einen .NET Web Service erstellen, müssen Sie an die URL der .asmx-Datei einfach den Parameter ?WSDL anhängen, und Sie erhalten automatisch ein WSDL-Dokument zurück. Abbildung 20.7 zeigt diese Beschreibung.

Bilder

Abbildung 20.7     Die automatisch erzeugte WSDL-Beschreibung

Nach diesem Muster können Sie noch viele weitere und deutlich komplexere Web Services erstellen. Der Titel und das Thema dieses Buches ist jedoch JavaScript, weswegen wir uns jetzt wieder auf clientseitiges Terrain begeben.

20.3 Mit dem Internet Explorer auf Web Services zugreifen 

Mit der Version 5 des Internet Explorer hat Microsoft so genannte Behaviors (englisch für »Verhalten«) eingeführt. Das ist nichts anderes als eine HTML-Anweisung, mit der Sie (unter anderem) die Voraussetzungen schaffen können, auf Web Services auch aus dem Browser heraus zuzugreifen.

Sie benötigen dazu zunächst eine .htc-Datei, die auf dem Microsoft-Webserver unter der URL http://msdn.microsoft.com/archive/en-us/samples/internet/behaviors/library/webservice/ zum Download zur Verfügung steht. Hinter der Datei webservice.htc verbergen sich fast 2300 Zeilen JavaScript-Code. Darin sind die gesamten notwendigen Funktionalitäten – Kommunikation mit dem Web Service, Dekodierung des XML-Rückgabewerts des Web Service und so weiter – implementiert. Kopieren Sie diese Datei in dasselbe Verzeichnis, in dem Sie auch die nächste Datei erstellen werden: die HTML-Maske zum Aufrufen, Ausführen und Auswerten des Web Service.

Zunächst müssen Sie das Web-Service-Behavior einbauen. Verwenden Sie dazu einfach ein <div>-HTML-Element, und setzen Sie den style-Parameter auf "behavior:url(webservice.htc)":

<div id="PrimzahlService"

     style="behavior:url(webservice.htc)"></div>

Als Nächstes benötigen Sie die Maske zum Abfragen des Web Service, d. h. ein Eingabefeld für die zu überprüfende Zahl und eine Schaltfläche zum Starten der Überprüfung:

<form>

   Bitte Zahl eingeben:

   <input type="text" name="zahl" size="5" />

   <input type="button" value="Prüfen"

          onclick="check(this.form);" />

</form>

Für die Ausgabe des Ergebnisses verwenden wir ein <p>-Element:

<p id="ausgabe">---</p>

Wie Sie sehen können, wird die Funktion check() aufgerufen, wenn Sie auf die HTML-Schaltfläche klicken. In dieser Funktion wird eine Reihe von Schritten durchgeführt.

Da zwischen dem Aufruf des Web Service und der Rückgabe des Ergebnisses einige Zeit verstreichen kann, wird zunächst ein Text ausgegeben, der den Besucher um ein wenig Geduld bittet:

document.getElementById("ausgabe").innerText =

   "Bitte warten ...";

Dann greifen Sie auf das Behavior zu. Da es den id-Parameter "PrimzahlService" hat, können Sie direkt über PrimzahlService von JavaScript aus darauf zugreifen. Mit der Methode useService() verbinden Sie das Behavior mit dem Web Service. Dazu übergeben Sie zwei Parameter:

1.

die WSDL-Beschreibung des Web Service; wie Sie wissen, erhalten Sie diese, indem Sie an die .asmx-Datei einfach ?WSDL anhängen.

   

   

 

2.

die Bezeichnung, unter der Sie auf den Web Service zugreifen möchten; "Primzahlen" ist eine gute Wahl.

   

   

PrimzahlService.useService(

   "Primzahlen.asmx?WSDL",

   "Primzahlen");

Im nächsten Schritt rufen Sie schließlich die gewünschte Methode des Web Service auf. Dazu müssen Sie auf PrimzahlService.Primzahlen zugreifen (beachten Sie, wie der zweite Parameter von useService() hier ins Spiel kommt) und dann die Methode callService() aufrufen. Die folgenden drei Parameter werden erwartet:

1.

die Funktion, die beim Eintreffen der Ergebnisse aufgerufen werden soll

   

   

 

2.

der Name der aufzurufenden Methode (hier: istPrimzahl())

   

   

 

3.

der oder die Parameter, die übergeben werden sollen

   

   

PrimzahlService.Primzahlen.callService(

   ergebnis,

   "istPrimzahl",

   f.elements["zahl"].value);

Das Vorgehen beim Aufrufen des Web Service wird auch als asynchron bezeichnet. Das Aufrufen und Auswerten des Web Service wird nicht in einem Aufwasch (synchron) erledigt, sondern in zwei Schritten; als ersten Parameter übergeben Sie an callService eine Referenz (also: keine Anführungszeichen, keine runden Klammern) auf die Funktion, die dann das Ergebnis des Web Service erhält.

Diese Funktion muss nun noch geschrieben werden. Als Parameter enthält sie ein Objekt, das unter anderem die folgenden Eigenschaften aufweist:

gpBilder
 

error – ein boolescher Wert, der angibt, ob beim Aufruf des Web Service ein Fehler aufgetreten ist (true) oder nicht (false).

 

gpBilder
 

value – das Ergebnis des Web Service, sofern vorhanden (sonst undefined).

Die folgende Funktion überprüft den Rückgabewert und gibt entweder eine Fehlermeldung oder "eine Primzahl" oder "keine Primzahl" aus, je nach Ergebnis des Web-Service-Aufrufs:

function ergebnis(wert) {

   if (wert.error) {

      ausgabe.innerText = "Fehler!";

   } else {

      ausgabe.innerText = (wert.value == true) ? "" : "k";

      ausgabe.innerText += "eine Primzahl";

   }

}

Nachfolgend sehen Sie noch einmal das komplette Listing. Es zeigt, dass Sie mit nur wenig Aufwand einen Web Service in Ihre HTML-Dokumente einbauen können – vorausgesetzt, Ihre Besucher benutzen einen Internet Explorer ab Version 5:

<html>

<head>

<title>Web Service</title>

<script type="text/javascript"><!--

function check(f){

   document.getElementById("ausgabe").innerText =

      "Bitte warten ...";

   PrimzahlService.useService(

      "Primzahlen.asmx?WSDL",

      "Primzahlen");

   PrimzahlService.Primzahlen.callService(

      ergebnis,

      "istPrimzahl",

      f.elements["zahl"].value);

}

 

function ergebnis(wert) {

   if (wert.error) {

      ausgabe.innerText = "Fehler!";

   } else {

      ausgabe.innerText = (wert.value == true) ? "" : "k";

      ausgabe.innerText += "eine Primzahl";

   }

}

//--></script>

</head>

<div id="PrimzahlService"

     style="behavior:url(webservice.htc)"></div>

<form>

   Bitte Zahl eingeben:

   <input type="text" name="zahl" size="5" />

   <input type="button" value="Prüfen"

          onclick="check(this.form);" />

</form>

<p id="ausgabe">---</p>

</body>

</html>


Bilder

Abbildung 20.8    
1021 ist also tatsächlich eine Primzahl.

Wenn Sie einen Web Service aufrufen, der nicht auf Ihrem Webserver liegt, hier noch ein Warnhinweis: Aus Sicherheitsgründen unterbindet der Internet Explorer in der Standardeinstellung den Zugriff eines Skripts auf Dokumente von einer anderen Domain. Um dies zu deaktivieren, wählen Sie Extras N Internetoptionen N Sicherheit N Stufe anpassen N Verschiedenes N Auf Datenquellen über Domaingrenzen hinweg zugreifen. Gehen Sie aber nicht davon aus, dass Ihre Benutzer auch diesen Schritt tun!

ilderkleinklein2009.gif" />

AbbildungBilder

Bilder

Abbildung 20.9    
Web Services von anderen Domains aufrufen

 

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


Bilder

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:

gpBilder
 

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

 

gpBilder
 

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:

gpBilder
 

antwort.body.firstChild ist das Element <istPrimzahlResponse>.

 

gpBilder
 

antwort.body.firstChild.firstChild ist das Element <istPrimzahlResult>.

 

gpBilder
 

antwort.body.firstChild.firstChild.firstChild ist der Text-inhalt des Elements <istPrimzahlResult>.

 

gpBilder
 

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>

Bilder

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.

 


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

 

Das Tutorial ist ein Auszug aus dem Buch von Stefan Münz:

Professionelle Websites - Programmierung, Design und Administration von Webseiten
Addison-Wesley, 2. Auflage, 1136 Seiten, gebunden, komplett in Farbe, mit DVD

Die Veröffentlichung des Kapitels erfolgt mit freundlicher Genehmigung von
Pearson Education.

Mehr Informationen zu diesem wunderbaren Fachbuch für Webmaster und Webentwickler
gibt es hier: Professionelle Websites

Alle Teile des Buches: 

1 Intro
2 HTML und CSS
3 Dynamische Seiten mit JavaScript/DOM
4 Die Server-Seite
5 PHP und MySQL
6 XML
7 Betrieb von Websites
8 Referenz
Bilder

Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von tanzfrosch
  • 11.01.2018 - 14:56

Dankeschön, tolles Tut. !

Portrait von MaoMao
  • 09.01.2013 - 16:59

Gute Tutorial leicht erklärt.

Portrait von mischa7788
  • 06.06.2008 - 09:13

super Buch, hat mir echt weitergeholfen !

x
×
×