Webservices sind eine spannende Sache. Man kann damit mit anderern Programmen kommunizieren. So kann man zum Beispiel mit PHP erstelle Funktionen in einem VB.net Programm aufrufen. Heute möchte ich euch einmal zeigen, wie man so etwas mit PHP macht.
Dateien des PHP-Webservice
WSDL-Datei
Ein WebService wird immer in einer WSDL Datei definiert. Die Url dieser Datei muss später im Client angegeben werden. Zum Aufbau gibt es später mehr
PHP-Datei
In der PHP Datei geschieht das Abarbeiten der Funktionen. Hier können wir zum Beispiel auf eine Webdatenbank zugreifen und Datenstätze an den Client senden.
Beispiel: Erstellung eines Mathe WebServices
WebServices sind eigentlich nicht dazu da, um einfache Berechnungen durchzuführen, die man so in jeder Sprache machen kann. Aber dies wird eben nur ein einfaches Beispiel. Denn ihr wollt ja wissenwie man einen WebService erstellt und dafür reichen auch einfache Funktionen. Außerdem ist es mit einfachen Funktionen übersichtlicher. Das komplizierte ist dann euch überlassen
SoapServer – Klasse
Die SoapServer Klasse ist die Klasse, die in der PHP-Datei angesprochen werden muss. Diese steht euch normalerweise unter PHP5 zur Verfügung.
Konstruktor
Der Konstruktor benötigt die WSDL-Datei als Parameter. Sie kann einfach im gleichen Verzeichnis wie das Script liegen.
Beispiel:
$server = new SoapServer("math.wsdl")
addFunction Methode
Mit der AddFunction Methode kann man den Namen der PHP-Funktion die ausgeführt werden soll hinzufügen.
Beispiel:
$server->addFunction("add");
Hier wird die PHP-Funktion add hinzugefügt (Definition unten).
handle Methode
Die Handle Methode führ die Funktion dann aus. Sie sollte am Ende der zuweisungen stehen.
Das komplette PHP-Script
Hier ist nochmal das komplette Script inkl. der add Funktion:
<?php function add($a, $b) { return $a + $b; } $server = new SoapServer("math.wsdl"); $server->addFunction("add"); $server->handle(); ?>
Die WSDL-Datei
Fehlt uns noch die WSDL-Datei. Wie eben bereits erwähnt steht in ihr die Definition des WebServices.
Fangen wir mal ganz oben an: Die XML-Deklaration. (Weil WSDL auf XML basiert)
<?xml version ='1.0' encoding ='UTF-8' ?>
Nach der Deklaration von XML kommt natürlich das Root-Tag im XML. Bei WSDL ist dies Definition:
<definitions name='Math' targetNamespace='http://temp.stevieswebsite.de/Math' xmlns:tns='http://temp.stevieswebsite.de/Math' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns='http://schemas.xmlsoap.org/wsdl/'>
Und hier sind die wichtigsten Attribute:
- Name: Gibt den Namen des WebServices an. Da es sich bei und um Mathe-Funktionen handelt, heißt der hier Math.
- targetNamespace, xmlns:tns: Geben den Namespace des WebServices an. Soweit ich weiß gibt es in PHP noch keine Namespaces, also werd ich mal kurz erklären worum es geht: Ein Namespace ist eine Gruppierung von Elementen (Klassen, Enums,…). Er kann auch weitere Namespaces beinhalten. Über VB.net würde man die Mathe Klasse so ansteuern: {Name des WS in VB}.de.stevieswebsite.temp.Math
Die weiteren Deklarationen definieren einfach, dass es sich um einen WebService handelt.
Jetzt geht es um den wichtigen Teile der WSDL. Fangen wir an mit der Definition der Rückgabe-Typen.
Mit dem Tag Message wird eine Gruppe von Parametern, die entweder zum Server geschickt wird, oder vom Server kommt:
<message name='addRequest'> <part name='a' type='xsd:int'/> <part name='b' type='xsd:int'/> </message> <message name='addResponse'> <part name='Result' type='xsd:int'/> </message>
Hier haben wir 2 Parameterlisten. Der erste ist addRequest. Er definiert die Parameter, die die PHP-Funktion erwartet. Wir haben in der Funktion add die Parameter a und b. Da wir diese addieren sind sie vom Typ int.
Die zweite Liste liefert den Rückgabewert der Funktion. Hier heißt er schlichtweg ‘Result’. Er ist ebenfalls ein int.
Nun geht es um die Zuweisung dieser Parameterlisten zur Funktion. Dies geschieht im Port-Type Tag.
Man kann dort mehrere operation-Tags angeben. Jeder Tag steht für eine Funktion:
<portType name='addPortType'> <operation name='add'> <input message='tns:addRequest'/> <output message='tns:addResponse'/> </operation> </portType>
Bei der Operation muss man als Namen den Namen der PHP-Funktion angeben. Im input-Tag wird die Parameterliste für den Funktionsaufruf angegeben. Output gibt hingegen die Liste des Rückgabewerts an.
Nun kommt noch das Binding. Hier müssen in Operation nochmal der Name desWSDL und der Funktionsname angegeben werden:
<binding name='addBinding' type='tns:addPortType'> <soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/> <operation name='add'> <soap:operation soapAction='urn:Math#add'/> <input> <soap:body use='encoded' namespace='urn:Math' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> </input> <output> <soap:body use='encoded' namespace='urn:Math' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> </output> </operation> </binding>
Jetzt kommen wir auch schon zum Ende der WSDL Datei. Wir müssen nun die URL der PHP-Datei angeben:
<service name='addService'> <port name='addPort' binding='addBinding'> <soap:address location='http://temp.stevieswebsite.de/server.php'/> </port> </service>
Das war jetzt nen bisschen lang. Deswegen ist hier nochmal die komplette WSDL-Datei.
<?xml version ='1.0' encoding ='UTF-8' ?> <definitions name='Math' targetNamespace='http://temp.stevieswebsite.de/Math' xmlns:tns='http://temp.stevieswebsite.de/Math' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns='http://schemas.xmlsoap.org/wsdl/'> <message name='addRequest'> <part name='a' type='xsd:int'/> <part name='b' type='xsd:int'/> </message> <message name='addResponse'> <part name='Result' type='xsd:int'/> </message> <portType name='addPortType'> <operation name='add'> <input message='tns:addRequest'/> <output message='tns:addResponse'/> </operation> </portType> <binding name='addBinding' type='tns:addPortType'> <soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/> <operation name='add'> <soap:operation soapAction='urn:Math#add'/> <input> <soap:body use='encoded' namespace='urn:Math' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> </input> <output> <soap:body use='encoded' namespace='urn:Math' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> </output> </operation> </binding> <service name='addService'> <port name='addPort' binding='addBinding'> <soap:address location='http://temp.stevieswebsite.de/server.php'/> </port> </service> </definitions>
Testen
Das es im diesem Tutorial nur über das erstellen eines WebServices geht und nicht um das Benutzen, zeige ich euch hier nur kurz, wie man den WebService testen. Wie ihr das nachher in eurem Code macht, solltet ihr später in der Doku eurer Programmiersprache nachsehen. Aber einen kleinen Tipp gib ich noch: In PHP gibt es eine Klasse die SoapClient heißt und im VS kann man über Projekt->Webverweis hinzufügen den WebService Benutzen.
Also jetzt zum Online Test. Hier bin ich auf die Seite soapclient.com gestoßen.
Hier kann man zu erst die URL des WebServices angeben. In meinem Fall ist dies http://temp.stevieswebsite.de/math.wsdl.
Nun sieht man die Funktionen und deren Parameter. In den Parametern kann man jetzt einfach unsere Werte für a und b eingeben. Ich teste es mal mit 5 und 9.
Wenn ich jetzt auf “Invoke klicke” bekomme ich 14 zurück. Klasse, es hat geklappt!






Danke für das Tutorial. Lässt sich gut lesen und ist mit Beispielcode.
Kommentar von Clatsch — 25. Juni 2009 @ 21:40
Wie immer ein Klasse Tutorial
Kommentar von Simon Strasser — 27. Juni 2009 @ 14:03
Vielen Dank euch beiden
Kommentar von Stefan Wienströer — 27. Juni 2009 @ 14:12
Tolles Tut, vielen Dank!
Kommentar von Mich — 9. Mai 2010 @ 10:25
Super Tutorial. Hat mir echt geholfen und auch ein rooky wie ich kommt sofort mit allem klar! DANKE
Kommentar von mkey — 31. August 2010 @ 13:55