SOAP via PHP II
Jan
9
Von:
09.01.2004
Tja, mit den kompexen Datentypen und nuSOAP hatte ich heute erhebliche Probleme. Selbst das Beispiel von D.Ayala bekam ich nicht zum Laufen. Es haperte daran, dass ich die über $server->wsdl->addComplexType() erzeugten Datentypen nicht mit ihrem Namespace ('tns:...') registrieren konnte. Mit dem Namespace 'xsd:..' ging es, aber dann wurden die Methoden im Studio (bzw. der Web-Referenz) nicht richtig erkannt.
Patrick überedete mich dann von nuSOAP abzusehen und die PEAR-Implementierung auszuprobieren. Nachdem die abhängigen Pakete identifiziert und installiert waren (PEAR, Mail_MIME, HTTP_Request, Net_Url, Net_Dime, und Net_Socket), hatte ich schnell einen einfachen Server laufen - allerdings noch ohne komplexe Datentypen.
Für die Registrierung von Servermethoden steht keine Methode zur Verfügung, sondern man erzeugt einen Hash-Eintrag in der Eigenschaft __dispatch_map:
$this->__dispatch_map['Echo'] =array('in' => array('message' => 'string'),'out' => array('outputString' => 'string'));
Auch die Registrierung von komplexen Datentypen verläuft in ähnlicher Weise:
$this->__typedef['{http://soapinterop.org/xsd}structKomplex'] = array('id' => 'int','name' => 'string','date_begin' => 'string','event_begin' => 'string','description' => 'string');
Um diesen Datentyp in einer Methode zu verwenden schreibt man dann einfach:
$this->__dispatch_map['UseKomplex'] =array('in' => array('id' => 'int'),'out' => array('komplex' => '{http://soapinterop.org/xsd}structKomplex'),);
Umständlich ist nur die Rückgabe der Struktur in der Service-Methode selbst, da diese durch Kombination von zu erzeugenden SOAP_Value-Instanzen zusammengesetzt werden muss. Ein Beispiel hierfür spare ich mir an dieser Stelle, weil das in den Beispielen des Paketes enthalten ist (und um niemanden abzuschrecken..;)
Viele Antworten auf Fragen gibt es in der Newsgroup zu PEAR::SOAP.