Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.php > #4209
| From | Thomas 'PointedEars' Lahn <PointedEars@web.de> |
|---|---|
| Newsgroups | de.comp.lang.php |
| Subject | Re: PHP-Soap: Im WSDL 2 Funktionen gleichen Namens |
| Date | 2017-08-14 22:36 +0200 |
| Organization | PointedEars Software (PES) |
| Message-ID | <7334207.T7Z3S40VBb@PointedEars.de> (permalink) |
| References | <omrrf2$1ap$1@news.albasani.net> |
Gerome Muent wrote:
> ich habe ein WSDL einer API (Across Language Server).
> Daran kann ich nichts ändern.
>
> Im WSDL gibt es 2 Funktionen gleichen Namens, aber mit unterschiedlichen
> Parametern:
> <message name="ObjectManager.GetTaskState">
> <part name="ST" type="xsd:string"/>
> <part name="DocumentGuid" type="xsd:string"/>
> <part name="SourceLanguageLcid" type="xsd:int"/>
> <part name="TargetLanguageLcid" type="xsd:int"/>
> <part name="TaskTemplateGuid" type="xsd:string"/>
> </message>
>
> <message name="TaskManager.GetTaskState">
> <part name="ST" type="xsd:string"/>
> <part name="TaskGuid" type="xsd:string"/>
> </message>
>
> Ich möchte nun explizit die 2. aufrufen aus dem Kontext "TaskManager".
>
> Ein Aufruf von
> $crossAPI->getTaskState($ST, $taskGUID);
> zeigt im Logfile aber, daß die erste aufgerufen wird und die nicht
> akzeptiert wird, weil eben zu wenig Parameter übergeben werden.
>
> Ich habe dann mal sowas probiert:
> $crossAPI->__call("TaskManager.getTaskState", array($ST, $taskGUID);
> oder
> $crossAPI->__callSoap("TaskManager.getTaskState", array($ST, $taskGUID);
>
> endet beides in:
> Function ("ObjectManager.GetTaskState") is not a valid method for
> this service
>
> Ein Auruf von $crossClient->getFunctions() liefert:
> zuerst:
> [90] => IResult GetTaskState(string $ST, string $DocumentGuid, int
> $SourceLanguageLcid, int $TargetLanguageLcid, string $TaskTemplateGuid)
> dann
> [550] => IResult GetTaskState(string $ST, string $TaskGuid)
>
>
> => Wie komme ich an die 2. Funktion heran?
Ich kenne mich mit SOAP/WSDL kaum aus⁰. Wenn ich jedoch das Beispieldokument
aus der WSDL-1.1-Spezifikation¹ mit PHP 5.6.30-0+deb8u1 (cli) verwende², dann
fällt mir auf, dass getFunctions() anscheinend nicht die Namen der Messages
im Dokument, sondern die Signaturen der an einen “port” “gebundenen”
*Operationen* liefert.
Dem Beispiel entnehme ich, dass die Messages anders heissen (müssen?) als
die Operationen:
| <message name="GetLastTradePriceInput">
^^^^^^^^^^^^^^^^^^^^^^
| <part name="body" element="xsd1:TradePriceRequest"/>
| </message>
|
| <message name="GetLastTradePriceOutput">
^^^^^^^^^^^^^^^^^^^^^^^
| <part name="body" element="xsd1:TradePrice"/>
| </message>
|
| <portType name="StockQuotePortType">
^^^^^^^^^^^^^^^^^^
| <operation name="GetLastTradePrice">
^^^^^^^^^^^^^^^^^
| <input message="tns:GetLastTradePriceInput"/>
^^^^^^^^^^^^^^^^^^^^^^
| <output message="tns:GetLastTradePriceOutput"/>
^^^^^^^^^^^^^^^^^^^^^^^
| </operation>
| </portType>
|
| <binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
| <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
| <operation name="GetLastTradePrice">
^^^^^^^^^^^^^^^^^
| <soap:operation soapAction="http://example.com/GetLastTradePrice"/>
| <input>
| <soap:body use="literal"/>
| </input>
| <output>
| <soap:body use="literal"/>
| </output>
| </operation>
| </binding>
|
| <service name="StockQuoteService">
| <documentation>My first service</documentation>
| <port name="StockQuotePort" binding="tns:StockQuoteSoapBinding">
^^^^^^^^^^^^^^^^^^^^^
| <soap:address location="http://example.com/stockquote"/>
| </port>
| </service>
Wenn ich das operation-Element im binding-Element auskommentiere, ist
mit
php -d soap.wsdl_cache_ttl=0 -r 'var_dump((new SoapClient("test.wsdl"))->__getFunctions());'
der Rückgabewert von __getFunctions() ein leeres Array; ansonsten:
| array(1) {
| [0] =>
| string(40) "UNKNOWN GetLastTradePrice(UNKNOWN $body)"
| }
Siehe auch <https://en.wikipedia.org/wiki/WSDL>.
PHPs SOAP-Implementierung unterstützt gemäss Handbuch nur ein *Subset*
von WSDL 1.1. Vielleicht ist das in diesem Fall das Problem:
<http://php.net/manual/en/intro.soap.php>
Beachte auch, dass WSDL-Dokumente von PHP *sitzungsübergreifend* gecachet
werden. Während der Entwicklung sollte deshalb soap.wsdl_cache_ttl=0
gesetzt werden. (Ich tat dies zunächst nicht, und es verwirrte mich beim
Testen: egal, was ich im Testdokument änderte, es wurde immer dieselbe
Funktionsliste zurückgegeben.)
<http://php.net/manual/en/soapclient.soapclient.php>
Ein minimales, *funktionelles* WSDL-Dokument zum Testen wäre hilfreich.
______________
⁰ für den ZCE hat mein Wissen darüber im entsprechenden Prüfungsabschnitt
immerhin gereicht ;-b
¹ <http://www.w3.org/TR/2001/NOTE-wsdl-20010315#_wsdl>
(Die Dokumentstruktur ist da übrigens auch kapott: referenziert wird
“1.1 WSDL Example” und es verweist auf “1.2 WSDL Document Example”;
jedoch existiert auch “1.2 Notational Conventions”)
² das war erst möglich, nachdem ich den Fehler, dass dort “StockQuoteBinding”
statt korrekt “StockQuoteSoapBinding” referenziert wird, korrigiert hatte
--
PointedEars
Zend Certified PHP Engineer <http://www.zend.com/en/yellow-pages/ZEND024953>
<https://github.com/PointedEars> | <http://PointedEars.de/wsvn>
Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.
Back to de.comp.lang.php | Previous | Next — Previous in thread | Find similar | Unroll thread
PHP-Soap: Im WSDL 2 Funktionen gleichen Namens Gerome Muent <kontakt@bmservices.de> - 2017-08-14 11:44 +0200 Re: PHP-Soap: Im WSDL 2 Funktionen gleichen Namens Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2017-08-14 22:36 +0200
csiph-web