0251 / 590 837 15

Tutorial: Webservice mit PHP erstellen

Webservice erstellen

Webservice erstellen

Webservices sind eine spannende Sache. Man kann damit mit anderen 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 Datensä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 wissen wie 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=newSoapServer("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
functionadd($a,$b){
  return$a+$b;
}

$server=newSoapServer("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 die 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 des WSDL 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 ein 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

Dass 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 zuerst 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!

Verwandte Themen

Kommentare

Clatsch schrieb am 25.06.2009:

Danke für das Tutorial. Lässt sich gut lesen und ist mit Beispielcode.

Tutorial: WebService mit ASP.net erstellen | SteviesWebsite Blog schrieb am 27.06.2009:

[...] Vorgestern gab es ein Tutorial, wie man einen WebService mit PHP erstellt. Heute werde ich den gleichen WebService in ASP.net erstellen. So das ihr einmal ein wenig [...]

Simon Strasser schrieb am 27.06.2009:

Wie immer ein Klasse Tutorial :)

Stefan Wienströer schrieb am 27.06.2009:

Vielen Dank euch beiden

SteviesWebsite Statistik Juli 2009 | SteviesWebsite Blog schrieb am 01.08.2009:

[...] Tutorial: Webservice mit PHP erstellen &#8211; 380 Zugriffe [...]

Mich schrieb am 09.05.2010:

Tolles Tut, vielen Dank!

mkey schrieb am 31.08.2010:

Super Tutorial. Hat mir echt geholfen und auch ein rooky wie ich kommt sofort mit allem klar! DANKE

Torben Brodt schrieb am 11.09.2010:

Ich fand das Tutorial hilfreich. Wenn man allerdings noch APIKey Authentifizerung benötigt und die WSDL automatisch erzeugt werden soll, dann habe ich ein paar Optimierungen. Hier zum Tutorial: http://www.easy-coding.de/wiki/php/php-soap-server-mit-wsdl-und-api-schluessel.html

Daniel schrieb am 25.10.2010:

Vielen Dank. Das ist genau die Lösung die wir benötigen.

Max von Arbeitskleidung.net schrieb am 19.11.2010:

besser und verständlicher kriegt man`s woanders wohl kaum. Einen recht herzlichen Dank für Eure Mühen die uns immer ein Stück weiter bringen.

Fastenwandern schrieb am 20.01.2011:

Vielen Dank für das tolle Tutorial. Ich bin immer noch am abwegen, ob ich versuche mit meinen normal Webpaket via php einen Webservice zu erstellen oder mir einen V-Server zuzulegen und dann via Java Webservices zu implementieren. Ich werde es auf jeden Fall mal mit Deinen Tutorial via php versuchen. Kann man sich die Dateien auch irgendwo runterladen? Gruss Thomas

Stefan Wienströer schrieb am 21.01.2011:

Nein, aber du brauchst auch wirklich nur den Code unter "Das komplette PHP Script" und "Das war jetzt nen bisschen lang. Deswegen ist hier nochmal die komplette WSDL-Datei."

Sven Trefinger schrieb am 08.11.2011:

Danke für das Tutorial. Sehr verständlich geschrieben, und gab mir, als SQL Backend Coder mit .Net als Frontend (also PHP absolut unbedarft), einen ganz guten Einblick was ich mir alles im Detail anlesen muss um in PHP einen WS zu implementieren.

Dominik schrieb am 21.01.2012:

Danke für diesen angenehmen Einstieg in die Materie. Eine Frage zur WSDL-Datei. Müsste die fünfte Zeile von unten nicht lauten: ? Ich hatte versucht clients in Visual Studio und NetBeans zu programmieren. Die jeweils integrierten Tools hatten die wsdl aber nur nach dieser kleinen Korrektur lesen können (siehe auch http://social.msdn.microsoft.com/Forums/de-DE/silverlightde/thread/f46fcd9f-fd22-4380-a82a-48e64444be20/).

Dominik schrieb am 21.01.2012:

Ok. Zweiter Versuch: Müsste es in der fünften Zeile von unten nicht lauten binding='tns:addBinding'?

wk-one schrieb am 26.02.2012:

Wow, der Kommentar "binding=’tns:addBinding’" hat mich weitergebracht. ich versuche für dieses Beispiel einen Java-Client zu erstellen und hatte beim einlesen der WSDL ständig den Fehler '[ERROR] wsdl:binding "{http://schemas.xmlsoap.org/wsdl/}addBinding" not found in the wsdl'

Dominik N. schrieb am 04.09.2012:

Eine kleine Ergänzung auch von mir für die jenigen die hier für ihre ersten Versuche das PHP Script kopieren: Es müssen bei 2 Leerzeichen gefügt werden: Bei 'function add' und 'new SoapServer("math.wsdl");' addFunction("add"); $server-&gt;handle(); ?&gt; Dann funktioniert das ganze auch ;-)

Nunu schrieb am 23.10.2012:

Hallo, ich bekomme leider immer folgende Fehlermeldung: We are sorry, the requested operation failed. The server returned the following messages Error Message: SoapClient::SendRequest - No data returned from the remote host:http://(meine Adresse)/server.php The extern component has failed in processing your requests. kann jemand mir vielleicht bitte weiterhelfen? Grüße, Nunu

Alex schrieb am 02.08.2013:

Danke für das Tutorial. Weist du, ob man bei dem Server auch Funktionen aus bestimmten Klassen dem Client zur Verfügung stellen kann? Würde mich sehr interessieren.

Stefan Wienströer schrieb am 05.08.2013:

Das geht nicht, der Webservice ist ja nur eine Art Schnittstelle. Dafür solltest du ein Framework zu Verfügung stellen.

Bernd schrieb am 03.10.2013:

Auch von mir herzlichen Dank für das tolle Tutorium. Es hat mir wirklich eine Menge Arbeit erspart! :-)

Adolf schrieb am 13.03.2014:

Wäre es möglich, ein Beispiel zu generieren, das zwei oder mehrere Funktionen bereitstellt? Ich versuche die ganze Zeit schon, eine Funktion namens "minus" dazuzufügen. Das klappt nur zur Hälfte, ich habe die wsdl Datei soweit angepasst, dass der Soap-Client die beiden Funktionen (plus und minus) zwar mit den richtigen Parametern erkennt, aber ausführen kann er nur die plus-Funktion (ganz gleich, in welcher Reihenfolge ich die Funkionen im php-Script und/oder in der wsdl Datei anordne. Es wird immer nur plus gefunden. Das ist ziemlich frustrierend! Vielleicht ist's ja nur eine Kleinigkeit und irgendwer weiß darüber Bescheid.