Webservices mit PHP und PEAR::SOAP - Einführung -
Dienstag, 06. Januar 2004 22:59
Download und Installation
PEAR::SOAP kann entweder mit dem PEAR-Framework installiert werden, wobei zu beachten ist, dass auch noch einige andere Pakete (Mail_Mime, HTTP_Request, Net_URL und Net_Dime) zu installieren sind, diese Dateien werden dann im pear-Verzeichnis von PHP gespeichert und sind über den Incude-Path von PHP verfügbar.
als 2. Möglichkeit kann man hier auch das ganze SOAP-Paket mit den herunterladen.
Falls man jetzt das SOAP-Paket als gepackte Datei heruntergeladen hat, stehen 2 Möglichkeiten zur Verfügung.
Die einfachste wäre die Dateien entpacken und im pear-Verzeichnis von PHP speichern, damit man über den Include-Path darauf zugreifen kann - setzt natürlich vorraus, das man auf das PHP-Verzeichnis zugreifen kann, was bei angemietetem Webspace i.d.R. nicht der Fall ist.
Eine Alternative ist, die Dateien in einem beliebigen Verzeichnis auf dem Webspace speichern und dann den Include-Path im Script explizit zu setzen - setzt vorraus, das die Option set_include_path in der php.ini nicht gesperrt ist.
set_include_path($_SERVER['DOCUMENT_ROOT'] . '/lib/pear/');
Falls man den set_include_path nicht setzen kann, wäre noch eine Möglichkeit (nicht die allerfeinste) alle Include-Pfade in den benötigten PEAR-SOAP-Klassen anzupassen (wären dann so 19 Dateien) und dann auch in einem beliebigen Verzeichnis auf dem Webspace zu speichern. Diese könnte man dann z.B. mit require_once('Datei_Pfad') einbinden.
Der PEAR::SOAP-Server
(ich gehe jetzt mal davon aus, dass das SOAP-Paket im Include-Path liegt)
Als erstes muss die SOAP-Server-Klasse eingebunden werden
require_once('SOAP/Server.php');
jetzt wird die Klasse definiert, welche dann die Methoden für den Webservice enthält.
In der Beispiel-Funktion wird ein einfacher String zurückgegeben.
class CWebservice
{
function sGetHello($sName){
return 'Hallo, '. $sName;
}
}
anschließend wird zuerst ein Objekt der Klasse SOAP_Server instantiiert und ein Objekt unserer Klasse CWebservice.
$oServer = new SOAP_Server();
$oWebservice = new CWebservice();
Nun muss unser Objekt der Klasse CWebservice noch mit addObjectMap() am SOAP-Server registriert werden.
$oServer->addObjectMap($oWebservice, 'urn:webservice');
Zum guten Schluss wird der Server-Dienst gestartet und die Datei mit exit() geschlossen.
$oServer->service($HTTP_RAW_POST_DATA);
exit;
das Beispiel-Skript für einen SOAP-Server:
<?php
require_once('SOAP/Server.php');
class CWebservice
{
function sGetHello($sName){
return 'Hallo, '. $sName;
}
}
$oServer = new SOAP_Server();
$oWebservice = new CWebservice();
$oServer->addObjectMap($oWebservice, 'urn:webservice');
$oServer->service($HTTP_RAW_POST_DATA);
exit;
?>
Der PEAR::SOAP-Client
nachdem die Client-Klasse eingebunden ist, wird ein Client-Objekt instantiiert, als Parameter wird hier der URL zum SOAP-Server übergeben.
require_once ('SOAP/Client.php');
$oClient = new SOAP_CLIENT( 'http://adresse/server.php');
Die erwarteten Parameter der Webservice-Methoden müssen als Array übergeben werden.
$aParameter = array("name" => "Rob");
die gewünschte Webservice-Methode wird nun mit call(aufzurufende Webservice Methode, Parameter, registrierter Name des Services) aufrufen.
$result = $oClient->call('sGetHallo', $aParameter, 'urn:webservice');
das Beispiel-Skript für einen SOAP-Client:
<?php
require_once ('SOAP/Client.php');
$oClient = new SOAP_CLIENT( 'http://adresse/server.php');
$aParameter = array("name" => "Rob");
$result = $oClient->call('sGetHallo', $aParameter, 'urn:webservice');
print_r($result);
?>
Fertig ist der erste Webservice (noch ohne Fehlerbehandlung, WSDL ...).