Keine Angst, das hier wird kein PHP-Blog ;) Aber ich habe gerade eine ziemlich zeitaufwändige Parameterfrickelei mit PHP, NuSoap, PHP5, einem IIS und einem VisualStudio-generierten SOAP-Server hinter mir.
PHP5
PHP5 klappt natürlich wunderbar:
class Request {function Request () {$this->client = new Soapclient ( $this->wsdl );... weiterer Code}function getSomething ($params){$result = $this->client->__getSomething ($params);var_dump ($result);}}
NuSoap
Bei NuSoap und PHP 4.3.10/.11 sieht es da anders aus. Der IIS-Service mag die Namespaces nicht, auch wenn ich die manuell aus dem WSDL hole und reinkopiere (das funktioniert noch nicht mal, wenn ich am Ende sogar den Request per Telnet absetze – ihr seht, ich war verzweifelt!). Ich bin nicht so der SOAP/XML-Chef, aber bisher hat’s immer gereicht.Aber:
$this->sc = &new soapclient ($this->wsdl, true);$result = $this->sc->call ("ServiceName", $params);
schlägt grandios fehl – mit Pauken und Trompeten. Wobei: Es wird kein Fehler erzeugt! Der SOAP-Server erkennt nur die Parameter nicht. Stellt man die Vorraussetzungen strikter ein (minOccurs=”1″ maxOccurs=”1″) kommt erst der Fehler.Aber NuSoap hat die grandiose Methode getProxy (). Dazu Scott Nichol:
WSDL enables one more capability on the client. Instead of using the call method of the soapclient class, a proxy can be used. The proxy is a class that mirrors the service, in that it has the same methods with the same parameters as the service.
Das ist aber nur die halbe Wahrheit: Nach einem Blick in den NuSoap-Quellcode wird klar, dass nicht nur die WSDL-Methoden zu Methoden der Klasse werden (leider mit einem unsäglichem eval() – aber wie auch sonst), sondern auch die Namespaces und Parameter exakt aus dem gelieferten WSDL übernommen werden (inkl. encoding usw.). Das ist genau das, was der IIS will:
$this->client = new soapclient ( $this->wsdl, true );$this->proxy = $this->client->getProxy ();$this->result = $this->proxy->MethodName ();var_dump ($this->result);
liefert auch mit PHP4 das erforderliche Resultat! Ich weiss, ich hätte für PHP4 besser PEAR nutzen sollen, oder gleich PHP5, habe ich aber nicht ;) Ach ja, und sorry für den dahingequasten Code, ich freu’ mich so, dass es klappt. Wenn ihr was Besseres wisst > Kommentare bitte!
… und wer Probleme mit der WSDL-Generierung hat,sollte sich vielleicht auch mal meine SoapRpcService.php anschauen, die auch NuSoap verwendet und die WSDL-Generierung vereinfacht, und zwar hier: http://www.schadeck.eu/index.php/2007/06/14/allgemein/soaprpcservicephp-wsdl-fur-soap-rpc-made-easy/
oh mann, Du bist der größte Hero für mich, wenn Du wüsstest wie lange ich mich jetzt mit dem Dreck geplagt habe… jetzt gehts!!!!Beste Grüße und besten Dank!!!themichl