SOAP Service mit einem SOAP Client in PHP nutzen

Ausschnitt einer WSDL-Datei

Ich habe in den letzten Wochen sehr viel Zeit damit verbracht SOAP Schnittstellen anzubinden. Verwendet wurde dabei der SOAP-Client BeSimpleSoap. An sich nicht Dramatisches, jedoch machte die fehlende Dokumentation der Komponente einiges schwerer als es sein müsste. In diesem Artikel möchte ich meine Erkenntnisse und Lösungen vorstellen und somit einen Teil zu der fehlenden Dokumentation beitragen.

Für die folgenden Beispiele verwende ich den Bankleitzahlen Web Service. Dieser Service ermittelt zu einer Bankleitzahl den Namen des Kreditinstitutes, die Postleitzahl und den Ort. Wenn die BLZ nicht gefunden wird, dann wird ein Fehler zurückgegeben.

Installation

Am besten verwendet man, wie bei den meisten Komponenten, Composer für die Installation. Einfach die composer.json erweitern und ein Update ausführen. Anschließend die autoload.php aus dem vendor Verzeichnis einbinden. Schon kann man loslegen.

SOAP Client

Jetzt können wir eine neue Instanz von SoapClient erzeugen. Als ersten Parameter erwartet die Klasse die URL zu der WSDL-Datei.

Mit der Methode __getFunctions() kann man schnell alle verfügbaren Methoden des Services ausgeben lassen. In unserem Fall erhalten wir nur die Methode getBank().

Die Methode getBank() erwartet als Parameter eine Variable vom Typ getBankType. Schauen wir in die WSDL-Datei und suchen nach der Definition von getBankType, finden wir Folgendes:

Das bedeutet, dass die Methode getBank() ein Objekt mit dem Attribut blz als ersten Parameter erwartet. Dabei ist das blz Attribut ein String. Probieren wir es doch mal aus.

Nach der Ausführung erhalten wir ein Objekt, das auch die Informationen zu unserer Bank enthält.

Wieso ein Objekt?

Trotzdem fällt etwas auf: Wir erhalten ein Objekt. Eigentlich würde man an der Stelle doch XML erwarten. Und auch der Request sollte XML beinhalten und wir haben eine Klasse übergeben.

Das liegt daran, dass der SOAP Client das XML anhand der WSDL-Datei automatisch in Objekte umwandelt. Dabei werden Instanzen von stdClass, mit den in der WSDL-Datei definierten Attributen, verwendet.

Eigene Klassen für das Mapping

Die zurückgegebenen Objekte sind wirklich super und man kann damit viel besser arbeiten als mit XML, jedoch wäre es ganz praktisch, wenn man auch gegen eigene Klassen „mappen“ könnte. So könnte man z.B. den Namen der Bank im Getter modifizieren oder gleich neue Methoden angeben, um einen Link zu der Google Suche (getGoogleSearchLink) auszugeben. (Mit ist an der Stelle kein besseres Beispiel eingefallen. In einem Fall bekam ich immer einen langen Beschreibungstext. Für die Ausgabe im Frontend brauchte ich aber zusätzlich eine gekürzte Version als Vorschau.)

Der SOAP Client ermöglicht auch das. Als Erstes können alle komplexe Knoten als Klasse angelegt werden. In unserem Beispiel wären es GetBankResponseType und DetailsType.

  • GetBankResponseType – Mit dem Attribut details (DetailsType)
  • DetailsType – Mit den Attributen bezeichnung (string)bic (string)ort (string) und plz (string)

Nachdem die Klassen angelegt worden sind, muss man nur das Mapping definierten. Dafür muss man beim Initiieren der SoapClient Instanz die Option classmap übergeben. Die Option muss ein Array mit den WSDL-Typen als Schlüssel und den PHP-Klassennamen als Wert sein.

Nun erhalten wir nicht mehr eine „anonyme“ Objektstruktur und können gleich zusätzliche Methoden definieren.

Das sollte für den Anfang reichen. Im kommenden Artikel werde ich auf das BeSimpleSoapBundle für Symfony2 eingehen. Da ist die Verwendung teilweise noch einfacher.

ALL-INKL.COM

Ein Kommentar zu dem Artikel “SOAP Service mit einem SOAP Client in PHP nutzen”