Ein einfacher SOAP-Server in PHP

Die Aufgabe ist eigentlich einfach: Zu einer gegebenen Eingabe sollen bestimmte Parameter aus einer Datenbank gezogen und der anfragenden Anwendung zur Verfügung gestellt werden. Diese Anwendung ist in meinem Falle Word, die Datenbank, aus der die Abfrage stammt, ist eine MySQL-Datenbank auf einem Web-Server, und die Installation eines entsprechenden Datenbanktreibers kommt aus bestimmten Gründen nicht infrage.

Die erste Lösung der Aufgabe – ein PHP-Skript schickt die Ausgabe per Trennzeichen geschickt als HTML-Ausgabe, und Word muss dann anhand des Trennzeichens die Werte wieder auseinander nehmen – war so hässlich, dass ich mich daran gemacht habe, das ganze als Web Service mit SOAP zu realisieren.

Grundgerüst

Die eigentliche Suchfunktion (also die Datenbankabfrage) ist wenig spektakulär:


function suche($suchbegriff)
{
    mysql_connect('localhost', 'user', 'password') or die('Could not connect: ' . mysql_error());
    mysql_select_db('datenbank');

    $SQL = "SELECT DISTINCT ergebnis FROM tabelle WHERE suchspalte LIKE '%$suchbegriff%'";

    $result = mysql_query($SQL);
    $ergebnisse = array();
    while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
        $ergebnisse[] = $row[0];
    } 

    mysql_free_result($result);
    return $ergebnisse;
}

(Das ist natürlich nicht der korrekte Code; insbesondere eine Werteprüfung von $suchbegriff fehlt!)

SOAP-Unterbau

Die verwendete PHP-Version verfügte leider nicht über die SOAP-Erweiterung, sodass ich mich nach einer externen Bibliothek umsehen musste. Die NuSOAP-Bibliothek schien mir hierfür geeignet, obwohl die letzte bei Sourceforge herunterladbare Version von 2005 ist.Tatsächlich lies sich damit der benötigte Webservice sehr einfach gestalten:Zunächst müssen natürlich die Bibliotheken eingebunden werden und der Server initialisiert werden:


require_once('nusoap/nusoap.php');
$server = new soap_server;

Anschließend teilen wir dem Server mit, dass wir auch WSDL anbieten wollen. WSDL ist eine Beschreibung der durch den Webservice angebotenen Funktionen, Datentypen usw.


$server->configureWSDL('suche');

Der Rückgabewert unserer Funktion ist ein Array, un der SOAP-Diktion ein komplexer Typ, der entsprechend definiert wird:


// register "array" type
$server->wsdl->addComplexType('ArrayOfString',
                              'complexType',
                              'array',
                              '',
                              'SOAP-ENC:Array',
                              array(),
                              array(array('ref'            => 'SOAP-ENC:arrayType',
                                          'wsdl:arrayType' => 'xsd:string[]'
                                         )
                                   ),
                              'xsd:string'
                             );

Die Funktionen, die per SOAP genutzt werden dürfen, müssen nun noch registriert werden. Damit wird erreicht, dass wirklich nur die gewünschten Funktionen „von außen“ zugänglich sind (anderenfalls wäre mit erheblichen Sicherheitsproblemen zu rechnen…)


// register the lookup service
$server->register('suche',
                  array('inputString' => 'xsd:string'),
                  array('return'      => 'tns:ArrayOfString'));

Die eigentliche Arbeit übernehmen nun die Zeilen


$HTTP_RAW_POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
$server->service($HTTP_RAW_POST_DATA);

Diese sorgen dafür, dass die im HTTP-Request angegebenen Befehle abgearbeitet werden und die Ergebnisse zurückgegeben werden.

Fazit

Mit NuSOAP ist es in der Tat sehr simpel, eine „ohnehin vorhandene“ Funktion als einen Webservice bereitzustellen. In weiteren Artikeln werde ich noch darauf eingehen, wie man diesen Webservice dann auch nutzen kann (mit NuSOAP, VB.net und – der ursprünglichen Aufgaben entsprechend – von Word aus).

2 Antworten auf „Ein einfacher SOAP-Server in PHP“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.