Probleme im Verständnis mit SOAP und WSDL
Bobby
- programmiertechnik
Moin
folgendes. Ich habe eine Webseite mit Artikeln und Artikelgruppen.
ich möchte gern die Anzahl der Artikelgruppen über SOAP mit Hilfe von SOAP und WSDL zurückgeben lassen. dazu möchte ich gern die SOAP-Erweiterung von PHP nutzen.
hier die Anfrage.php:
<?php
$client = new SoapClient('http://localhost/shop/info.wsdl');
$result = $client->getCategoryCount();
echo $result;
Dazu die info.wsdl:
<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions name='TestServer'
xmlns:tns=' [url]http://localhost/shop/info.wsdl[/url] '
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
xmlns='http://schemas.xmlsoap.org/wsdl/'>
<message name='getCategoryCountRequest'>
</message>
<message name='getCategoryCountResponse'>
<part name='Result' type='xsd:float'/>
</message>
<portType name='TestServerPortType'>
<operation name='getCategoryCount'>
<input message='tns:getCategoryCountRequest'/>
<output message='tns:getCategoryCountResponse'/>
</operation>
</portType>
<binding name='TestServerBinding' type='tns:TestServerPortType'>
<soap:binding style='rpc'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='getCategoryCount'>
<soap:operation soapAction='urn:xmethodsTestServer#getCategoryCount'/>
<input>
<soap:body use='encoded' namespace='urn:xmethodsTestServer'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:xmethodsTestServer'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>
<service name='TestServerService'>
<port name='TestServerPort' binding='TestServerBinding'>
<soap:address location='http://localhost/shop/index.php?view=wsdl'/>
</port>
</service>
</definitions>
als letztes die http://localhost/shop/index.php?view=wsdl
<?php
function getCategoryCount() {
return $a;
}
$server = new SoapServer(NULL,
array('uri' => "http://localhost/shop/"));
$server->addFunction('getCategoryCount');
$server->handle();
Bei der letzten Datei steht mir (außerhalb der Funktion getCategoryCount() eine VAriable mit der Anzahl der Kategorien zur Verfügung ($cats)
wie bekomme ich die nun an die Funktion getCategoryCount() übergeben? Ich habe im WSDL definiert, das eine leere Message an den Server geht und die ANzahl zurückkommen soll.
Aber irgendwier bekomm ich die Variable nicht in die Funktion getCategoryCount(). Wenn ich da zum Beispiel eine Zahl hardcode, dann funktioniert diese, was mir sagt, dass meine WSDL richtig ist. Anders aber leider nicht.
Wer kann helfen?
Gruß Bobby
Moin
OK, eine Ergänzung. Es liegt am Scope. Soviel habe ich bereits rausgefunden. Ich habe eine klassische MVC-Struktur, worin diese Abfrage eingebettet sein soll. Jedoch ist hier irgendein Denkfehler drin.
Gruß Bobby
Moin!
Moin
OK, eine Ergänzung. Es liegt am Scope. Soviel habe ich bereits rausgefunden. Ich habe eine klassische MVC-Struktur, worin diese Abfrage eingebettet sein soll. Jedoch ist hier irgendein Denkfehler drin.
Warum zum Henker denn SOAP?
Ich habe beruflich derzeit viel mit SOAP in PHP zu tun, und es macht nur so eingeschränkt Spaß - und das zu 95% nur als Client, der Server ist bis auf eine PHP-Ausnahme Java. Man kann sich das Leben einigermaßen angenehm machen, indem man in PHP das Classmap-Feature nutzt, anstatt ein Gemansche von stdClass-Objekten und Arrays zu haben, aber insgesamt würde ich behaupten: PHP und SOAP sind keine echten Freunde und werden es auch nicht mehr.
Gerade wenn du sowieso weborientiert bist und eine Webseite hast, warum bietest du die nicht eher als RESTful Service an? SOAP ist zwar auch HTTP, aber in schlecht. Dort ist alles POST (kein Caching möglich), es ist reine RPC-Struktur - funktioniert zwar, aber für das, was hier scheinbar "nur" an Infos ausgetauscht wird, klingt es oversized.
Wie man HTTP-Requests mit PHP korrekt beantwortet, dürfte dir ja vermutlich klar sein. :) Auf ein "GET /api/shop/categories?sum=count" zu antworten ist keine Hexerei. Die URL lässt auch Raum, auf "GET /api/shop/categories" die Liste der Kategorien zu liefern. Warum nur die Anzahl irgendwie relevant sein soll, wäre zu prüfen, man kann die Liste ja auch clientseitig zählen und auswerten.
- Sven Rautenberg
Warum SOAP .. ganz einfach. SOAP gibt dir die Garantie dass ein Aufruf verlaesslich nur einmal ausgefuehrt wird. REST is absolut nicht verlaesslich in dieser Hinsicht.
... und das ganze ist natuerlich kompletter Schwachsinn, den ich taeglich von einem Power-Entwickler hier aufgetischt bekomme ...
Leider fehlt mir im Moment ein stichhaltiges Argument um ihn fuer immer zum Schweigen zu bringen (in dieser Angelegenheit) .. falls jemand eins haette, SUPER!
Hinweise auf die RFC 2616 haben bislang nicht geholfen. :-)
Danke
Frank
Moin!
Warum SOAP .. ganz einfach. SOAP gibt dir die Garantie dass ein Aufruf verlaesslich nur einmal ausgefuehrt wird. REST is absolut nicht verlaesslich in dieser Hinsicht.
Ähm...
... und das ganze ist natuerlich kompletter Schwachsinn, den ich taeglich von einem Power-Entwickler hier aufgetischt bekomme ...
Ah ja... ;-)
Leider fehlt mir im Moment ein stichhaltiges Argument um ihn fuer immer zum Schweigen zu bringen (in dieser Angelegenheit) .. falls jemand eins haette, SUPER!
Einfach zwei Aufrufe machen... :-P
Gerne auch parallel. :->
- Sven Rautenberg
Er begreift es immer noch nicht ... ich weiss aber mittlerweile etwas mehr darueber, woher seine fehlerhafte Auffassung kommt:
WS-ReliableMessaging
Cheers
Frank