[php] Tutorial – SOAP mit dem Zend Framework

Die Frequenz an Zend Artikeln hier im Blog ist steigend, da ich immer mehr damit zu tun habe. Und es ist ein geiles Framework!

Eine meiner vielen Aufgabenstellung war nun die Anbindung anderer Applikationen per SOAP Webservice Schnittstelle an das bestehende System.

Für alle, die nicht wissen, was ein Webservice ist: Es handelt sich dabei um eine Schnittstellentechnik, die es ermöglicht, dass Anwendungen über die Grenzen von Programmiersprache und Betriebssystem hinaus miteinander kommunizieren können. Die Schnittstellensprache ist dabei XML, und zwar in beiden Richtungen. Man ruft Funktionen per XML auf und erhält auch die Ergebnisse in XML-Form.

Nun kann man das ganze zusammenbauen, anschließend eine umfangreiche Dokumentation schreiben und sie dann an die Partner bzw. Benutzer weitergeben. Mann kann aber auch auf WSDL setzen – Webservice Description Language – die das vollautomatisch für einen erledigt. Unter Zend Framework muss man seine Funktionen nur mit Kommentaren im PHP Doc Format ausstatten und anschließend die entsprechende Funktion aufrufen – schon wird die WSDL automatisch erzeugt und man kann auf die entsprechenden Funktionen zugreifen.

Das erstmal als Hintergrundwissen. Aber wie wird der Webservice nun aufgebaut? Dazu benötigt man möglichst zwei Klassen: eine Klasse, um den Webservice zu verwalten sowie eine weitere Klasse, die die verfügbaren Funktionen stellt. Die Klasse zur Verwaltung ist aber wirklich optional, ihr könnt den Code auch an anderer Stelle platzieren.

Erstellen wir zuerst einmal die Klasse, die die aufrufbaren Funktionen bereit stellt:

class webservice
{
	/**
	 * get a hello world
	 *
	 * @param string $name
	 * @return string
	 */
	public function getHello($name)
	{
		return 'Hello world, '.$name.'!';
	}

}

Wie man sieht, eine stinknormale Klasse. Wichtig hier nochmal: die PHP Doc Kommentare!!! Ohne die funktioniert das nicht!

Nun noch das Handling des Webservice, was ich mal aus Gründen der Einfachheit ohne Klasse platziere:

ini_set("soap.wsdl_cache_enabled", 0);
$request = new Zend_Controller_Request_Http();
$url = 'http://testserver/webservice_test/public/api/remote?wsdl=show';

if($request->getQuery('wsdl') == 'show')
{
	$autodiscover = new Zend_Soap_AutoDiscover();
	$autodiscover->setClass('webservice');
	$autodiscover->handle();
}
else
{
	$server = new Zend_Soap_Server($url);
	$server->setClass('webservice');
	$server->handle();
}

So, das war jetzt schon ein bisschen komplizierter. Aber gehen wir den Spass doch mal Stück für Stück durch:

In der ersten Zeile deaktiviere ich soap.wsdl_cache_enabled, weil man sonst Probleme während der Entwicklung bekommt. Ruft man die WSDL nämlich ab, ändert danach etwas und ruft sie erneut ab, wird die Version aus dem Cache genommen und eure Änderungen kommen da ja nicht drin vor. Wichtig: schaltet soap.wsdl_cache_enabled auch bei eurem Client aus! Nach der Entwicklung könnt ihr das gerne wieder deaktivieren.

Anschließend hole ich mir das Zend Request Objekt, über welches ich überprüfe, ob die WSDL angefordert oder der Webservice selbst angesprochen wird – sprich, ich schau mir den GET-Parameter “wsdl” an und werte sein Value aus.

$url enthält den Pfad, welcher den auf den Webservice zeigt. Sprich: Wenn die WSDL unter http://testserver/webservice_test/public/api/remote?wsdl=show erreichbar sein soll, dann muss dieser Pfad auch hier so drin stehen. Grund dafür ist, dass der SOAP Server selbst diese Webservice Definition benötigt, sonst funktioniert er nicht!!! Dieser Punkt hat mich fast verzweifeln lassen, also passt hier besonders auf! Falls ihr an dieser Stelle Probleme habt: einfach mal vom Webserver aus die URL per Wget oder Curl aufrufen und prüfen, ob ihr ein Ergebnis bekommt. In meinem Fall konnte der Webserver nicht die URL zu sich selbst auflösen und somit auch nicht die URL aufrufen.

In der folgenden Weiche unterscheide ich wie gesagt, ob die WSDL angefordert wird oder nicht. Zend_Soap_AutoDiscover sorgt für die automatische Generierung einer WSDL Beschreibung, Zend_Soap_Server kümmert sich dann um die SOAP Requests.

Das war es eigentlich schon, und ihr habt euren ersten Webservice geschrieben.

Links

http://framework.zend.com/manual/en/zend.soap.server.html

  1. No comments yet.

  1. July 16th, 2010
Comment are closed.