Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.php > #4209
| Path | csiph.com!aioe.org!news.mb-net.net!open-news-network.org!.POSTED.201.232.197.178.dynamic.wless.lssmb00p-cgnat.res.cust.swisscom.ch!not-for-mail |
|---|---|
| From | Thomas 'PointedEars' Lahn <PointedEars@web.de> |
| Newsgroups | de.comp.lang.php |
| Subject | Re: PHP-Soap: Im WSDL 2 Funktionen gleichen Namens |
| Date | Mon, 14 Aug 2017 22:36:48 +0200 |
| Organization | PointedEars Software (PES) |
| Lines | 141 |
| Message-ID | <7334207.T7Z3S40VBb@PointedEars.de> (permalink) |
| References | <omrrf2$1ap$1@news.albasani.net> |
| Reply-To | Thomas 'PointedEars' Lahn <php@PointedEars.de> |
| Mime-Version | 1.0 |
| Content-Type | text/plain; charset="UTF-8" |
| Content-Transfer-Encoding | 8Bit |
| Injection-Info | gwaiyur.mb-net.net; posting-host="201.232.197.178.dynamic.wless.lssmb00p-cgnat.res.cust.swisscom.ch:178.197.232.201"; logging-data="23788"; mail-complaints-to="abuse@open-news-network.org" |
| User-Agent | KNode/4.14.2 |
| X-Face | %i>XG-yXR'\"2P/C_aO%~;2o~?g0pPKmbOw^=NT`tprDEf++D.m7"}HW6.#=U:?2GGctkL,f89@H46O$ASoW&?s}.k+&.<b';Md8`dH6iqhT)6C^.Px|[=M@7=Ik[_w<%n1Up"LPQNu2m8|L!/3iby{-]A+#YE}Kl{Cw$\U!kD%K}\2jz"QQP6Uqr],./"?;=4v |
| Cancel-Lock | sha1:V6y9SD8BF0MgI9KmC/9ONEJ49eA= |
| X-User-ID | U2FsdGVkX18bjqARVb2Udd+E3574shs3VbnLX8tQHI1fMGhO1eriaQ== |
| Face | iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEXTxa4RFk5dUWANED8PFEfy7+MGBiW+n3ZNF/QuAAACaElEQVQ4jVXUwVOcMBQG8Dc7Rc4PUntdWV2uxjDpGaGeozOp1woar4jd5t/v9wLstMwsA/ntlxdCAgUc1hjTc9/JCZfGoo3wG3HdmdAWrIJRHe7GM/TmpY5VFefuVcAkkPbLIaN8rmPmjloyZxgyR3GuJ4K0AGtJ2htz8o7yqikm759fldQXaMpbDzjKAG+8v+AugVTOPO5DOjLvGtUYQwh0CPjnVMyGd+8/GfUB5nLKJDD2aLDh5HYyMDJGDwQIo2ZmZcKbowNmAdB/AzyFhrmF2MHRb0QJJfaAnwGB6orZhoykLzJtGwF/xpYxI1dswomiUj3gTuAIqCn/4C7cULwGNBtwMTk3Y4LfKB5YUaOKBKYtpplm7u0vip8tU1NWWyI/7XdcSuIDoMt6rVHMWT0DbjHPGqDqZVSa6zleLcUTcIKLoMv3ueJluALtAo9B302zPPlrtiVScRdCjXvVh3e3JpYa/jjkuC9N+LrBMlz/eAN4eQijX2EdLo6c5tGGHwLyHFtXk89dDGHwCVhG9T0S/j55AhRZgkMCmUQXJ49TnS1wnQDvw0eAh9ICeMmEFbCnPMFzjAvsWoEWEFdYEx+S0MoUZ1gT1wId8+AF3Bl2OoEu906AUHx5VLw/gXYg/x84loOah/2UYNrgiwSwGO7RfUzVBbx/kgpckumGOi6QirtD6gkLTitbnxNol47S2jVc2vsN5kPqaAHT8uUdAJM4v/DanjYOwmUjWznGfwB7sGtAtor5BgofDuzaRj4kSQAqDakTsKORa3Q3xKi3gE1fhl71KRMqrdZ2AWNNg/YOhQyrVBnb+i+nEg4bsDA+egAAAABJRU5ErkJggg== |
| Xref | csiph.com de.comp.lang.php:4209 |
Show key headers only | View raw
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