2009-08-25 3 views
5

Ich versuche einen Webdienst zu verwenden, um nach bestimmten Benutzern aus meiner PHP-Anwendung zu suchen. Ich habe den gleichen Webservice in ASP.NET mit Erfolg verwendet.PHP 5 SOAP-Client gibt NULL zurück, wenn die WSDL-Funktion aufgerufen wird

Grundsätzlich mache ich alles wie das PHP doc sagt mir, und ich benutze die gleichen Methoden/Variablen, die ich in ASP.NET verwendet (für den Webservice selbst), aber ich kann nicht scheinen, ein Ergebnis zu erhalten.

Die Funktion wird in __getFunctions() aufgeführt und sollte anyType zurückkehren, was wenn ich das richtig ist das Äquivalent von mixed in PHP zu verstehen:

array(1) { [0]=> string(63) "anyType basicSearch(string $sharedSecret, string $searchParams)" } 

Wenn ich, wie es scheint NULL obwohl nennst basicSearch() zurückkehrt .

basicSearch() soll ein XML-Dokument mit den Informationen zurückgeben. In ASP.NET habe ich die Antwort einfach, glaube ich, an XmlDocument gesendet. Soll ich das auch in PHP machen? Mit welcher Darstellung eines XML-Dokuments (SimpleXML, DOM, etc.)?

Kann es als NULL angezeigt werden, nur weil PHP das Format nicht verstehen kann?

Mache ich etwas falsch in PHP? Oder sollte ich in den Webservice selbst schauen und versuchen, auf dieser Seite zu debuggen?

<?php 
    $client = new SoapClient($wsdl_url); 

    echo $client->__getFunctions(); 
    echo "<br />\n"; 
    echo $client->basicSearch($key, $req); 
?> 

PS: Ich benutze die PHP 5-Bibliothek. Vielleicht hilft eine andere Bibliothek wie Nu-Soap? Es scheint mehr Online-Dokumentation darüber zu geben.


Update:

ein Array mit dem Parameter übergeben funktioniert nicht erwartet SOAP getrennte Argumente. Der Aufruf von __getLastRequest() gibt eine Zeichenfolge zurück, die $ key und $ req mit keinem anderen XML verkettet. Der Aufruf von __getLastResponse() gibt eine leere Zeichenfolge zurück. Es gibt keine Ausnahme. Es scheint, dass PHP nicht weiß, was mit den Argumenten zu tun ist, die ich ihm gebe, obwohl es die WSDL-Datei syntaktisch analysiert hat, da ich die Funktion, die ich benutze, beim Aufruf von __getFunctions() aufrufe.

Jede Hilfe wäre willkommen.

Update ': Noch keine Lösung funktioniert. Ich bin verwirrt ...

+0

Beachten Sie, dass ein Array Echo werden Sie immer geben ‚Array‘, denn das ist, wie ein Array in einen String umwandelt. Versuchen Sie es mit print_r() oder var_dump(). –

+0

Yup, jetzt bekomme ich die korrekte Funktion aufgelistet. Danke, das wusste ich und habe es verpasst. Problem aktualisiert. –

+0

In Ihrem Codebeispiel wird nicht nach Ausnahmen gesucht, die vom Client ausgelöst werden. Haben Sie dies zur Vereinfachung des Beispiels weggelassen? Wenn nicht, würde ich vorschlagen, diese Überprüfung über try/catch hinzuzufügen, da es Ihnen möglicherweise hilfreiche Fehlermeldungen liefert. –

Antwort

4

Ich fand diese ganze Sache ziemlich verwirrend, als ich begann, die SoapClient-Bibliotheken in PHP zu verwenden. Der richtige Weg, dieses Zeug zu formatieren, ist wie folgt:

$client = new SoapClient($wsdl_url, array("trace" => 1)); 

$params = array(
    "sharedSecret" => "thisIsSomeSecret", 
    "searchParams" => "thisIsSomeSearchParam" 
); 

$response = $client->basicSearch($params); 

Ohne die Antwort zu sehen, kann ich Ihnen nicht sagen, wie die Rückgabeparameter verweisen, aber die Art und Weise seines als Mitglied var ein stdClass Objekt gespeichert ist . So dass Sie die Rücksendungen wie folgt referenzieren ...

$ reponse-> paramName;

Ein schöner Trick, wenn Sie halten die array („Spur“ => 1) von Optionen da drin ist, dass Sie diese beiden Funktionen aufrufen können ....

$respXML = $client->__getLastResponse(); 
$requXML = $client->__getLastRequest(); 

... die sehen tatsächliche Xml, die gesendet wird, um zu sehen, ob es wohlgeformt ist. Vorsicht, SoapClient ist ziemlich fehlerhaft. Viel besser als Nusoap, gehen Sie nicht für diesen Müll.

+1

Ich stimme nicht in der Notation/Format Bemerkung: Sie übergeben die Argumente als ein Array nur, wenn Sie die '$ client -> __ soapCall ($ Funktionsname, $ Argumente)' Mehtod, die hauptsächlich für nicht WSDL-Verwendung gedacht ist. Wenn Sie WSDL verwenden, sollten Sie Funktionen direkt über den Namen aufrufen und die Argumente wie beim OP einzeln übergeben. –

+0

Aber ich stimme der Verwendung der Trace-Option und __getLastRequest() zu, um nach dem tatsächlich zurückgegebenen Wert zu suchen. –

+0

Wie Henrik Opel erwähnt, scheint die Array-Methode nicht zu funktionieren. PHP beschwert sich über einen fehlenden Parameter, der benötigt wird. Wenn ich trace und __getLastRequest() und __getLastResponse() verwende, bekomme ich eine Verkettung des ersten Parameters und der zweiten als meine Anfrage und eine leere Zeichenfolge als Antwort, als ob PHP nicht wusste, was ich mit meiner Anfrage machen soll. Ein Aufruf von __getFunctions() gibt die Funktion zurück, die ich benutze, daher wird die WSDL gelesen ... Diese ganze Sache ist verwirrend. –

1

yeap

$ client = new Soapclient ($ wsdl_url, array ("Spur" => 1));

„Spur“ Parameter hilft

Verwandte Themen