Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.php > #4209

Re: PHP-Soap: Im WSDL 2 Funktionen gleichen Namens

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>

Show all headers | 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 | NextPrevious in thread | Find similar | Unroll thread


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