
| SOAP Simple Object Access Protocol (SOAP) ist ein Protokoll, mit dessen Hilfe Daten zwischen Systemen ausgetauscht und Remote Procedure Calls durchgeführt werden können. Es stützt sich auf die Dienste anderer Standards: auf XML zur Repräsentation der Daten und auf Internet-Protokolle der Transport- und Anwendungsschicht zur Übertragung der Nachrichten. Die gängigste Kombination ist SOAP über HTTP und TCP. |
| XML Extensible Markup Language (XML). XML ist eine so genannte Metasprache zur Beschreibung von Dokumenten. Ein Vorteil von XML ist der vereinfachte Austausch von Daten, da XML-Formate in einer strengen Grammatik definiert werden können und so die Implementierung von zuverlässigen Schnittstellen erlaubt. |
| WSDL Web Services Description Language. WSDL definiert einen plattform-, programmiersprachen- und protokollunabhängigen XML-Standard zur Beschreibung von Web-Services, die einen Austausch von Nachrichten ermöglichen. WSDL gibt also das Format für eine einheitliche Beschreibung eines Web-Services vor, anhand dessen ein solcher Service angefragt und dessen Funktionen abgerufen werden können. |
| HTTP Hypertext Transfer Protocol (engl.: Hypertext-Übertragungsprotokoll). HTTP ist ein Protokoll zur Übertragung von Daten über ein Netzwerk. Es wird hauptsächlich eingesetzt, um Webseiten und andere Daten aus dem Internet in einen Webbrowser zu laden. |
| XML-RPC Extensible Markup Language Remote Procedure Call. XML-RPC ist eine Definition zum Methodenaufruf (oder auch Funktionsaufruf) durch verteilte Systeme. Sie ist eine Verbindung von zwei Standards: Für den Transport der Daten wurde auf HTTP zurückgegriffen, die Darstellung der übertragenen Daten geschieht in XML. Eine Implementierung von XML-RPC ist ohne großen Aufwand in unterschiedlichen Programmiersprachen und auf unterschiedlichen Systemplattformen möglich. Historisch gesehen stellt XML-RPC den Vorgänger zu SOAP dar, ist im Gegensatz zu diesem jedoch wesentlich schlanker und schneller zu verstehen. |
Viele große Anbieter stellen ihre Dienste im Internet längst zusätzlich über Web-Services zur Verfügung. So können Sie z. B. auf Ihrer eigenen Webseite eine Google- oder Amazon-Suche einbauen. Mittlerweile stellen diese Anbieter ganze APIs für die Benutzung der Dienste bereit. Große Reise- und Hotelbuchungssysteme sind über Web-Services bei den eigentlichen Anbietern angebunden. Und auch eines der am weitesten verbreiteten Content Management Systeme, das PHP-basierte CMS Typo3, ermöglicht die Administration über eine SOAP-Schnittstelle. Web-Services für die unterschiedlichen Anwendungsmöglichkeiten sind im Internet zu finden. Deren Programmierung und Benutzung sind durchaus einen genaueren Blick wert.
| ||||||||||||||
|
Standards spielen bei Web-Services eine essentielle Rolle. Wie auch sonst wäre ein problemloser Austausch von Nachrichten möglich? Für eine automatisierte Weiterverarbeitung ist ein einheitliches, definiertes Aussehen der Daten unerlässlich. Web-Services setzen daher für den Datenaustausch auf den XML-Standard. Diese XML-Daten müssen bestimmten Regeln entsprechen, damit eine problemlose Kommunikation zwischen Web-Service-Anbieter und -Nutzer gewährleistet werden kann. Um diese Regeln bzw. das genaue Aussehen der XML-Nachrichten zu definieren, kommt bei deren Programmierung SOAP zum Einsatz.
SOAP ist ein Netzwerkprotokoll, das aus XML-RPC hervorging, jedoch nicht zwingend, wie sein Vorgänger, auf das Hypertext Transfer Protocol (HTTP) als Übertragungsprotokoll angewiesen ist. Somit könnten SOAP-Nachrichten auch über SMTP, TCP oder UDP übertragen werden. Jedoch hat sich auch hier HTTP größtenteils durchgesetzt, da es ein sehr einfach gehaltenes Protokoll ist und der Standard-HTTP-Port 80 meistens nicht von Firewalls geblockt wird. Über SOAP können im Zusammenspiel mit der Web Service Description Language (WSDL) auch komplexere Datentypen wie z. B. Klassen oder auch Dateien transportiert werden, wohingegen XML-RPC auf wenige einfache Datentypen beschränkt ist. Eine SOAP-Nachricht wird mittels XML repräsentiert und nutzt standardmäßig auch die Datentypen des XML-Schemas.
In PHP 5 ist die SOAP-Erweiterung bereits ein fester Bestandteil und oft auch schon aktiviert. Sie können über die Ausgabe von phpinfo() feststellen, ob die Erweiterung aktiviert ist. Dort sollte etwas Vergleichbares, wie in Abbildung 1 stehen. Ist dieser Abschnitt nicht vorhanden, so muss die SOAP-Erweiterung zunächst in PHP integriert werden. Unter Windows wird dazu der entsprechende Eintrag extension=php_soap.dll in der Datei php.ini aktiviert. Den Linux-Benutzern bleibt nichts anderes übrig, als PHP neu zu kompilieren und dabei den Schalter --enable-soap mit anzugeben. Mit einer aktivierten SOAP-Erweiterung sind nun die Voraussetzungen zur Web-Service-Programmierung erfüllt. Damit stellt PHP spezielle Klassen und Methoden bereit, die Ihnen helfen, mittels SOAP zu kommunizieren, ohne selbst die XML-Nachrichten erzeugen zu müssen. Diese Arbeit übernimmt PHP für Sie!
In PHP steht es Ihnen frei, einen Web-Service mit oder ohne WSDL-Beschreibung bereitzustellen. Betrachten wir zunächst die Erstellung einer Web-Service Serverkomponente ohne WSDL-Datei, die sich auf nur wenige Code-Zeilen beschränkt. In Abbildung 2 sehen Sie, wie eine Serverkomponente mit PHP 5 erstellt wird. Zunächst definieren wir eine Funktion, die unsere Geschäftslogik implementiert. Sie ist in diesem Fall recht einfach gehalten, kann aber je nach Belieben komplexe Verarbeitungen und Datenbankzugriffe beinhalten. Im Non-WSDL-Modus wird nur die Angabe einer URI für den Namensraum des Services benötigt. Als nächstes erzeugen wir ein neues Objekt vom Typ SoapServer und übergeben dem Konstruktor null für den WSDL-Datei-Parameter und das Array $options. Mit der Methode addFunction wird dem Objekt eine Funktion bekannt gemacht, die von einem Client aufgerufen werden darf. Zu guter Letzt wird dem Objekt SoapServer mit der Methode handle mitgeteilt, dass es Anfragen von anfragenden Clients bearbeiten soll.
Haben Sie mehr als eine Funktion, die Sie im Web-Service bereitstellen möchten, müssen Sie die Methode addFunction für jede Ihrer Funktionen separat aufrufen. Dies kann bei sehr vielen Funktionen den Code stark wachsen lassen. Daher sei Ihnen hier ans Herz gelegt, in so einem Fall die Funktionen in einer Klasse zu kapseln und mit der Methode setClass des Objekts SoapServer zu arbeiten. Ein Beispiel dafür sehen Sie in den Abbildungen 3 und 4. Hier ist zu beachten, dass die Methode setClass zwar mehrmals verwendet werden kann, aber für ein Objekt SoapServer immer nur die zuletzt gesetzte Klasse gültig ist.
Die Programmierung einer Client-Komponente für den Zugriff auf die eben erzeugten Web-Services ist mit PHP durch wenige Code-Zeilen abgehandelt. Schauen Sie sich hierzu die Abbildung 5 an. Wie Sie sehen, arbeiten wir in der client.php zunächst im Non-WSDL-Modus und definieren ein Array namens $options. Darin hinterlegen wir unter dem Schlüssel location den URI zu unserer Server-Komponente. Das zweite Element ist der URI für den Namensraum, der auch in der Server-Komponente gewählt wurde. Wir erzeugen ein neues Objekt vom Typ SoapClient und übergeben dem Konstruktor null für den WSDL-Dateiparameter und das Array $options. Somit kennt der Client die URI zum Web-Service und kann die Funktion sagHallo aufrufen. Den Rückgabewert dieser Funktion geben wir anschließend mit echo aus.
Sie sehen, dass Sie sich selbst keinerlei Gedanken über die SOAP-Nachrichten machen müssen. PHP übernimmt die gesamte Arbeit für Sie. Dies beinhaltet das Senden der Nachricht im korrekten SOAP-XML-Format vom Client an den Server sowie die Generierung und das Zurücksenden der Antwort vom Server an den Client.
Ein gut funktionierendes Programm ohne ausreichende Dokumentation oder Beschreibung hilft dem Benutzer nicht viel weiter. Aus diesem Grund ist es sinnvoll, auch zu Ihrem Web-Service eine Dokumentation mitzuliefern. Diese erfolgt in Form einer WSDL-Datei, in der die Funktionen und Datentypen Ihres Web-Services hinterlegt und den Entwicklern von Clients zur Verfügung gestellt werden.
Das manuelle Erstellen einer WSDL-Datei ist sehr fehleranfällig, daher sollten Sie sich hierbei mit externen Programmen behelfen. Bekannte PHP-Entwicklungsumgebungen wie das Zend Studio oder Eclipse PDT unterstützen die Erstellung von WSDL-Dateien - entweder durch einen Wizard oder eine grafische Schnittstelle. Die automatische Generierung einer WSDL-Datei zu einem bestehenden Web-Service ist in PHP leider noch nicht implementiert. Es gibt allerdings schon Programme, die Ihnen diese Arbeit zu großen Teilen abnehmen. Zu diesen Programmen zählen unter anderem das Web Service Framework for PHP von WSO2 [1], das PHP-Framework Prado der Prado Group [2] oder auch nuSOAP [3]. Letzteres erfreute bereits unter PHP 4 die Entwickler, weil es schon eine Möglichkeit bot, Web-Services mit SOAP zu implementieren.
In Abbildung 6 sehen Sie die WSDL-Datei zu unserem obigen Beispiel. Zunächst werden zwei Nachrichten definiert, welche die Anfrage (sagHalloRequest) an den Service, sowie seine Antwort (sagHalloResponse) darauf repräsentieren. Diese beiden Nachrichten bilden die Operation sagHallo, welche unserer Funktion in der Klasse MyWebServiceClass.php entspricht. Im nun folgenden binding-Block legen wir das zu nutzende Transportprotokoll und die Formatierung der Ein- und Ausgabe fest. Der Transport der Daten findet mittels SOAP über HTTP statt und die Formatierung der Ein-/Ausgabe soll literal sein. Unter welcher URI der Web-Service erreichbar ist, definieren wir im letzten Abschnitt der WSDL-Datei und verweisen bei location auf unsere server_klasse.php.
Um die soeben erstellte WSDL-Datei in unserem Web-Service zu verwenden, muss bei der Instanzierung der Objekte SoapServer und SoapClient der Pfad zur Datei angegeben werden. Abbildung 7 zeigt hierzu die Code-Ausschnitte aus der server_klasse.php und der client.php. In der Client-Komponente können wir jetzt mittels der Methode __getFunctions() des SoapClient Objekts alle Funktionen, die der Web-Service bereit stellt, ausgeben lassen. Wären wir noch etwas weiter gegangen und hätten eigene Typen definiert, so würde uns die Methode __getTypes() eine Liste aller in der WSDL-Datei vorkommenden Datentypen liefern.
Wenn die URI zum Web-Service bekannt ist, kennen Sie automatisch auch die URI zu dessen WSDL-Datei. Um deren Inhalt z. B. im Browser anzuzeigen, hängen Sie einfach ?wsdl an die URI des Web-Services. Da diese Datei nicht lokal von Ihnen gespeichert werden muss, sondern lediglich dem Client als Parameter mitgegeben wird, könnten Sie demnach anstatt $wsdl = 'http://localhost/ws/WebService.wsdl'; auch $wsdl = 'http://localhost/ws/server_klasse.php?wsdl'; in der Datei client.php schreiben.
Das Objekt SoapClient stellt dem Programmierer eine Reihe von Methoden zur Verfügung, die bei der Kontrolle des SOAP- Nachrichtenaustausches mit dem Web-Service behilflich sind:
Diese Methoden können jedoch nur eingesetzt werden, wenn die Instanz des Objekts SoapClient mit der Option trace [z. B. $client = new SoapClient(null, array('trace' => 1))] erstellt wurde.
Tritt beim Aufruf des Web-Services ein Fehler auf, so wird standardmäßig eine Exception vom Typ SoapFault erzeugt. Diese können Sie wie gewohnt mit try und catch abfangen. Ein Beispiel hierfür können Sie in Abbildung 8 sehen. In diesem Beispiel rufen wir eine Funktion sagHallo2 auf, die der Web-Service nicht anbietet. Dies führt zu einem Fehler. Mit der Funktion print_r lassen wir uns den Inhalt des Objekts SoapFault anzeigen.
Besonders in der Entwicklungsphase eines Web-Services müssen Sie sicherlich oft Änderungen an der WSDL-Datei durchführen, bis diese die von Ihnen gewünschte Beschreibung für den Service liefert. In dieser Phase ist es hilfreich, den php.ini-Parameter soap.wsdl_cache_enabled auf 0 zu setzen. Damit wird das Zwischenspeichern der vom Web-Service benutzten WSDL-Datei verhindert und wird bei jedem Aufruf neu ausgewertet. In einer Produktionsumgebung ist es aus Performance-Sicht ratsam, diese Einstellung wieder zu aktivieren.
Diese Einführung in die Web-Service-Programmierung mit PHP 5 unter der Verwendung des SOAP-Standards zeigt, dass es keine Zauberei ist, einen Web-Service aufzusetzen und anzusprechen. Durch die SOAP-Erweiterung von PHP 5 wird dem Programmierer viel Arbeit abgenommen, der ansonsten selbst die XML-Nachrichten für die Web-Service-Kommunikation erstellen müsste. Ein kleiner Wermutstropfen ist leider die "von Haus aus" fehlende Unterstützung zur Generierung von WSDL-Dateien, wobei hier externe Programme weiterhelfen. Mit der Unterstützung für Web-Service-Standards kann auch PHP 5 in einem Atemzug mit Technologien wie JEE oder .NET genannt werden.
Lars Hendrik Korte (info@ordix.de).