Ich bin es gewohnt, PHP-Code zu schreiben, verwende aber nicht oft objektorientierte Codierung. Ich muss jetzt mit SOAP (als Client) interagieren und kann die Syntax nicht richtig verstehen. Ich habe eine WSDL-Datei, mit der ich mithilfe der SoapClient-Klasse eine neue Verbindung ordnungsgemäß einrichten kann. Ich kann jedoch nicht den richtigen Anruf tätigen und keine Daten zurückerhalten. Ich muss die folgenden (vereinfachten) Daten senden:
- Kontakt-ID
- Kontaktname
- Allgemeine Beschreibung
- Menge
Im WSDL-Dokument sind zwei Funktionen definiert, aber ich benötige nur eine ("FirstFunction" unten). Hier ist das Skript, das ich ausführe, um Informationen zu den verfügbaren Funktionen und Typen zu erhalten:
$client = new SoapClient("http://example.com/webservices?wsdl");
var_dump($client->__getFunctions());
var_dump($client->__getTypes());
Und hier ist die Ausgabe, die es generiert:
array(
[0] => "FirstFunction Function1(FirstFunction $parameters)",
[1] => "SecondFunction Function2(SecondFunction $parameters)",
);
array(
[0] => struct Contact {
id id;
name name;
}
[1] => string "string description"
[2] => string "int amount"
}
Angenommen, ich möchte die FirstFunction mit den Daten aufrufen:
- Kontakt-ID: 100
- Name des Ansprechpartners: John
- Allgemeine Beschreibung: Ölfass
- Betrag: 500
Was wäre die richtige Syntax? Ich habe alle möglichen Optionen ausprobiert, aber es scheint, dass die Seifenstruktur ziemlich flexibel ist, so dass es sehr viele Möglichkeiten gibt, dies zu tun. Konnte es auch nicht aus dem Handbuch herausfinden ...
UPDATE 1: Probe von MMK ausprobiert:
$client = new SoapClient("http://example.com/webservices?wsdl");
$params = array(
"id" => 100,
"name" => "John",
"description" => "Barrel of Oil",
"amount" => 500,
);
$response = $client->__soapCall("Function1", array($params));
Aber ich bekomme diese Antwort : Object has no 'Contact' property
. Wie Sie in der Ausgabe von sehen können getTypes()
, gibt es einen struct
Aufruf Contact
, also muss ich wohl irgendwie klarstellen, dass meine Parameter die Kontaktdaten enthalten, aber die Frage ist: Wie?
UPDATE 2: Ich habe auch diese Strukturen ausprobiert, der gleiche Fehler.
$params = array(
array(
"id" => 100,
"name" => "John",
),
"Barrel of Oil",
500,
);
Ebenso gut wie:
$params = array(
"Contact" => array(
"id" => 100,
"name" => "John",
),
"description" => "Barrel of Oil",
"amount" => 500,
);
Fehler in beiden Fällen: Objekt hat keine 'Kontakt'-Eigenschaft`
Sie können SOAP-Dienste auch folgendermaßen verwenden:
Dies ist ein Beispiel mit einem echten Service, und es funktioniert.
Hoffe das hilft.
quelle
Initialisieren Sie zuerst die Webservices:
Stellen Sie dann die Parameter ein und übergeben Sie sie:
Beachten Sie, dass der Methodenname in WSDL als Operationsname verfügbar ist, z.
quelle
Ich weiß nicht, warum mein Webdienst dieselbe Struktur wie Sie hat, aber er benötigt keine Klasse für Parameter, sondern nur ein Array.
Zum Beispiel: - Meine WSDL:
Ich var_dump:
Hier ist das Ergebnis:
Also in meinem Code:
aber es erfolgreich!
quelle
lesen Sie dies;-
http://php.net/manual/en/soapclient.call.php
Oder
Dies ist ein gutes Beispiel für die SOAP-Funktion "__call". Es ist jedoch veraltet.
quelle
Verwenden Sie zuerst SoapUI , um Ihr Seifenprojekt aus der WSDL zu erstellen. Versuchen Sie, eine Anfrage zu senden, um mit den Operationen der WSDL zu spielen. Beobachten Sie, wie die XML-Anforderung Ihre Datenfelder zusammensetzt.
Und wenn Sie Probleme haben, SoapClient so zu gestalten, wie Sie es möchten, können Sie es wie folgt debuggen. Stellen Sie die Option trace so ein, dass die Funktion __getLastRequest () zur Verwendung verfügbar ist.
Dann die $ xml enthält die Variable die XML, die SoapClient für Ihre Anfrage erstellt. Vergleichen Sie diese XML mit der in der SoapUI generierten.
Für mich scheint SoapClient die Schlüssel des assoziativen Arrays $ params zu ignorieren und als indiziertes Array zu interpretieren, was zu falschen Parameterdaten in der XML führt. Das heißt, wenn ich die Daten in $ params neu anordne , ist die $ Antwort völlig anders:
quelle
Wenn Sie das Objekt von SoapParam erstellen, wird Ihr Problem dadurch behoben. Erstellen Sie eine Klasse und ordnen Sie sie dem von WebService angegebenen Objekttyp zu. Initialisieren Sie die Werte und senden Sie die Anforderung. Siehe das Beispiel unten.
quelle
Ich hatte das gleiche Problem, aber ich habe die Argumente einfach so verpackt und es funktioniert jetzt.
Mit dieser Funktion:
Sie können die Anforderungs-XML sehen, ob sie sich abhängig von Ihren Argumenten ändert oder nicht.
Verwenden Sie [trace = 1, Ausnahmen = 0] in den SoapClient-Optionen.
quelle
Sie braucht Klasse deklariert Vertrag
oder
Dann
oder
quelle
Sie benötigen ein mehrdimensionales Array. Sie können Folgendes ausprobieren:
In PHP ist ein Array eine Struktur und sehr flexibel. Normalerweise verwende ich bei Seifenaufrufen einen XML-Wrapper, der nicht sicher ist, ob er funktioniert.
BEARBEITEN:
Möglicherweise möchten Sie versuchen, eine JSON-Abfrage zum Senden zu erstellen oder damit eine XML-Kaufabfrage zu erstellen. Gehen Sie dazu wie folgt vor: http://onwebdev.blogspot.com/2011/08/php-converting-rss- to-json.html
quelle
Es gibt eine Option zum Generieren von PHP5-Objekten mit der WsdlInterpreter-Klasse. Weitere Informationen finden Sie hier: https://github.com/gkwelding/WSDLInterpreter
beispielsweise:
quelle
getLastRequest ():
Diese Methode funktioniert nur, wenn das SoapClient-Objekt mit der Trace-Option TRUE erstellt wurde.
TRUE wird in diesem Fall durch 1 dargestellt
arbeitete für mich.
quelle