2010-11-19 5 views
2

Leute,SOAP PHP Aufruf von .NET. Keine Parameter

Ich benutze SOAPClient in PHP, um einen .NET Webservice aufzurufen. Alles in Ordnung und Dandy, bis zu dem Punkt, wo ich Parameter übergebe. Der Remote-Webservice stellt eine Anfrage an eine listener.php-Datei, die die Antwort verarbeitet, jedoch scheint sie derzeit nicht in der Lage zu sein, die Parameter zu ermitteln ... die Anfrage zu prüfen, bevor sie gesendet wird, scheint die Parameter nicht zu zeigen im XML.

Kann mir jemand definitiv zeigen, wie man Parameter übergibt? Bisher habe ich über 3 verschiedene Möglichkeiten gesehen, einschließlich, aber nicht beschränkt auf die folgenden:

$pCriteria->AuctionID = new SoapVar($auction_id, XSD_INT, 'xsd:int');

oder:

$ar_bidupdate_params_total = array('AuctionID' => $auction_id,'parameter2... etc..)

oder:

$ar_bidupdate_params = array( new SoapParam($auction_id, 'AuctionID'),

Der Beispielcode zeigt auch, dass er auf verschiedene Arten aufgerufen wird (aus dem, was ich gesehen habe) das Netz).

$info = $soapClient->__call("BidUpdate", array($pCriteria));

oder

$info = $client->BidUpdate($pCriteria);

Frage ist, 1) Wie gebe ich diese Parameter zuverlässig nativen Soapclient verwenden, und 2) Was ist der beste Weg, dies zu tun?

Alternativ, wenn ich dies nicht zum Ball spielen kann, könnte ich einfach das XML on the fly erstellen. Wenn ich diesen Ansatz wähle, was ist der beste Weg, die XML-Kette zu senden?

Antwort

3

Um Ihre Bedenken zu begründen: JA, die Arbeit mit dem SoapClient kann frustrierend sein. Meistens wegen der Dokumentation. Hier ist ein Beispielcode für Sie, mit dem ich vor einiger Zeit für ein Projekt gearbeitet habe. Ich benutzte diese Technik in einer Bibliothek für ein Zahlungs-Gateway. Ich weiß, dass das mit dem dereferenzierten Funktionsaufruf von einem String-Namen nicht gerade hübsch ist, aber es funktioniert.

$method = "ACTION"; 
$wsdl = "WSDLFILE.wsdl"; 
$parameters = array (
    'location'    => "http://url.com", 
    'local_cert'   => "/full/path/to/CERTIFICATE.pem," 
    'passphrase'   => "TEST-PASSWORD", 
    'use'     => SOAP_ENCODED , 
    'connection_timeout' => 4, 
    'user_agent'   => null 
); 
$client = new SoapClient($wsdl, $parameters); 
$response = $client->{$method}($data); 
var_dump($response); 

Um dies näher auszuführen, nachdem Sie Ihre WSDL-Datei und Zertifikat eingerichtet haben (falls erforderlich), dann ist die Soapclient auf dem eine Funktion fliegen erzeugt (das $ method), der entspricht, was in der WSDL ist, das heißt: für eine Aktion wie "Capture()" oder "Authorize()". Der Client verarbeitet dann das XML-Senden/Parsen. Ob Sie SOAP_ENCODED verwenden oder nicht, und wie Sie die Parameter übergeben, hängt davon ab, was auf der anderen Seite steht.

Ich habe mit dem Erstellen von Umschlag XML manuell behandelt, obwohl, und ich würde davon abraten. Solange Sie einen guten WSDL-Dump bekommen, was ein .NET-Projekt automatisch macht und kein Problem sein sollte, ist es ein guter Weg, einen Wartungs-Albtraum zu vermeiden, wenn er geändert/aktualisiert wird, anstatt manuell zu gehen Twiddle XML-Text.

+0

Es wird empfohlen, die WSDL-Datei zwischenzuspeichern, um die Vorgänge zu beschleunigen und unnötigen Netzwerkverkehr zu reduzieren. – zanlok

+0

Laut der PHP-Site ist "__call" veraltet und "__soapCall" ist mehr für Nicht-WSDL-Modus. Sie können Methoden direkt auf dem Objekt aufrufen, und ich dereferenziere sie, so dass sie nicht im Haupt-Kommunikationsmodul fest codiert sind, sondern an anderer Stelle im benutzerdefinierten Klassencode angegeben sind. http://www.php.net/manual/en/soapclient.soapcall.php – zanlok

0

1) Wie übergebe ich diese Parameter zuverlässig mit nativem SoapClient Dies ist schwierig, weil PHP nicht gerne Debugging-Fehler gibt. Stellen Sie sicher, dass Sie alle Ihre Anrufe testen, um sicherzustellen, dass Ihr Timeout korrekt eingerichtet ist (PHP gibt nur false bei Timeout-Fehlern zurück) und dass Ihre Parameter korrekt sind. Der einzige Weg, dies zuverlässig zu tun, ist sicherzustellen, dass Sie wissen, was für Ihr System funktioniert, und innerhalb dieser Parameter bleiben.Überprüfen Sie alle verschiedenen Optionen (Timeout, Anmeldeinformationen usw.) und spielen Sie mit ihnen herum, bis Sie etwas wirklich Solides erhalten.

2) Was ist der beste Weg, dies zu tun? Beide Aufrufe sind korrekte Syntax, und die Parameterstruktur ist wirklich nicht so komplex, es ist nur etwas Arbeit zuerst, das ist der schwierige Teil. Meine Struktur ist normalerweise so etwas wie: $ opts = array (... Optionen ...); $ client = neuer SoapClient ('https: //URL/WebAPI/WebAPI.asmx? WSDL', $ opts);

$paramters = array('a_sUserID' => $un, 'a_sUserPass' => $pw, 'xmlBatch' => $createTicketXML); 

Dann rufen wie:

$result = $client->call('GetAllMembers',$paramters); 

Und das ist eine normale Schleife ich auf ein erfolgreiches Ergebnis zu machen:

foreach ($result['GetMemberAllResult']['MemberData'] as $key => $value) 
{ 
    //code 
} 

Die Sache, die mich aber am meisten hilft heraus, die ich bekommen alles Setup mit SoapUI (http://www.soapui.org/) dann migrieren alles auf PHP. Dort können Sie Tests ausführen und herausfinden, was genau in Ihren Anrufen passiert, indem Sie ein Tool verwenden, das für SOAP entwickelt wurde.

0

Nur um euch alle wissen zu lassen, wie wir weitergekommen sind. Das Problem, das ich hatte, war aufgrund eines komplexeren Typs, der definiert wurde. Deshalb hat es nie die Funktion als einzelne Parameter eingegeben, sondern die Funktion als Klasse nur passiert, wenn eine 'Klassenkarte' definiert wurde.

Wir haben festgestellt, dass etwas weiter benötigt wird, wenn man versucht, den Dienst über .NET zu nutzen (MS bindet alles in Visual Studio). Es wurde offensichtlich, dass eine zusätzliche Klasse als Parameter übergeben wurde Es wäre offensichtlich gewesen, wenn wir die WSDL ein bisschen mehr verstanden hätten.

$classmap = array('UpdateInfo' => 'UpdateInfo'); 

$server = new SoapServer("domain.com/Listener.wsdl", array('classmap' => $classmap, 'soap_version' => SOAP_1_2, 'encoding' => 'UTF-8', 'uri' => 'http://tempuri.org/'));# 

Parameterarray wird wie normal übergeben. Danke euch beiden für die Hilfe, wenn auch nicht ganz die Richtung, die ich brauchte.

+0

Sie sind herzlich willkommen. Und, danke fürs Teilen. Alles in allem, meine Erfahrung mit SOAP stopft uns, es ist ein Aufwand, um zu arbeiten, obwohl schön, wenn es einmal ist. – zanlok