Ich habe mit wurde eine sehr geschäftige Zeit mit webservices an wen soll ich anrufen PHP und heute habe ich gehabt SOAP-Header zu behandeln. Die Wahrheit ist, dass es eine Welt ist ziemlich dunkel und ich trafen uns mit vielen Hindernissen. Ich werde Ihnen sagen, wo und wie ich gelöst, aber lassen Sie uns zuerst einen Blick auf einige der Theorie.
Die Web Services haben sich die primäre Modus des Austauschs von Informationen zwischen Anwendungen unabhängig von Plattformen, Betriebssystemen und Programmiersprachen. SOAP ist eines der Protokolle, auf denen Daten ausgetauscht werden und ist basierend auf XML, so dass der Client fragt den Server mit einem XML-Format und erhält die Antwort in einem anderen XML. Um zu verstehen was wir meinen, schauen wir uns die Struktur einer SOAP-Anfrage und Antwort.
Call (Anfrage):
- encoding = "UTF-8" ?> <? Xml version = "1.0" encoding = "UTF-8"?>
- xmlns:ns1= "com.xplota.ws" > Xmlns: SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: ns1 = <SOAP-ENV:Envelope "com.xplota.ws">
- <SOAP-ENV:Header>
- <ns1:entity>
- <code> 1 </ code>
- <desc> </ Desc>
- </ Ns1: entity>
- <ns1:language>
- <code> 1 </ code>
- <desc> </ Desc>
- </ Ns1: Sprache>
- <ns1:userId>
- <code> 1 </ code>
- <desc> </ Desc>
- </ Ns1: user>
- </ SOAP-ENV: Header>
- <SOAP-ENV:Body>
- </ SOAP-ENV: Body>
- </ SOAP-ENV: Envelope>
Antwort (Response):
- encoding = "utf-8" ?> <? Xml version = "1.0" encoding = "UTF-8"?>
- xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema" > <Soap: Envelope xmlns: soap = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd = " http://www.w3.org/2001/XMLSchema ">
- <soap:Header>
- > <StAtUS xmlns = "com.xplota.ws">
- <code> 0 </ code>
- <desc> OK </ desc>
- </ Status>
- </ Soap: Header>
- <soap:Body>
- </ Soap: Body>
- </ Soap: Envelope>
Wie in den Vorjahren Inserate gesehen, sowohl die Anfrage und die Antwort besteht aus zwei XML-Knoten, Kopf und Körper. Die häufigsten wird der Körper (die ich leer gelassen, weil wir dieses Mal sind nicht interessiert an) und die Antwort enthalten sowohl die Parameter die in diesem gesendet werden, um die WebService in den Antrag zurück, wie.
Senden von SOAP-Headern
Im vorliegenden Fall sollte senden bestimmte Parameter im Header lesen und von dort potenzielle Fehler-Codes, wenn es gewesen war. Die Sendung, obwohl sie eine Struktur, anstelle eines einfachen Parameter, war einfach, definieren Sie eine Klasse mit den entsprechenden Parametern und wird direkt gesendet. Die PHP SOAP-Engine ist verantwortlich für die Übersetzung. Betrachten Sie eine Fallstudie.
- / / Definieren der Klasse headers
- wsHeader Klasse
- (
- = 0 ; public $ Code = 0;
- = ” ; public $ Desc = ";
- $code , $desc ) { public function __construct ($ code, $ desc) (
- = $code ; $ This -> $ code = Code,
- = $desc ; $ This -> Desc = $ desc;
- )
- )
- / / Eine Instanz der SOAP-Client
- SoapClient ( "http://midominio.com/ws?wsdl" , $par ) ; $ Client = new SoapClient ("http://midominio.com/ws?wsdl", $ par);
- / / Schreibe die Überschriften, um Zugriffe
- = new SoapHeader ( "com.xplota.ws" , 'entity' , new wsHeader ( 1 , ” ) ) ; $ Header [] = new SoapHeader (com.xplota.ws "," Unternehmen ", neue wsHeader (1"));
- = new SoapHeader ( "com.xplota.ws" , 'language' , new wsHeader ( 1 , ” ) ) ; $ Header [] = new SoapHeader (com.xplota.ws ',' Sprache ', neue wsHeader (1 "));
- = new SoapHeader ( "com.xplota.ws" , 'userId' , new wsHeader ( 1 , ” ) ) ; $ Header [] = new SoapHeader (com.xplota.ws ',' userid ', neue wsHeader (1 "));
- $headers ) ; $ Client -> __setSoapHeaders ($ header);
- / / Launch der Aufruf der Methode wurde
- -> TuMetodo ( $parametros ) ; $ Result = $ client -> TuMetodo ($ params);
Wie Sie sehen können ist ganz einfach zu verstehen. Durch das Hinzufügen einer Kopfzeile muss Motors geben den Namespace gehört es zu den SOAP weiß, wie sie zu behandeln, ist es ein Name gegeben, und das Objekt enthält, dass.
Mit dieser haben wir gelöst Köpfe der Druckseite unserer und haben eine SOAP-Anfrage, wie wir XML angegeben in der ersten.
Empfangen von SOAP-Headern
Nun, da die Methode in unserem Webservice Inserat sagt mit einigen anderen Headern, dass wir wissen, wie man an zweiter Stelle zu interpretieren, die XML-Antwort wie die. Dann haben wir ein sehr großes Problem. Es gibt keine Möglichkeit, diesen Header zu erhalten, die SOAP-Engine von PHP liefert nur den Körper, nie Header.
Nach der manuellen Methode PHP __soapCall SOAP-Client-Header definieren ein Array zurück, die diesen Willen, aber ich war nicht in der Lage, Syntax führen Sie den Aufruf einer Webservice-Methode mit diesem unter Berufung auf diese direkt auf dem Client (wie Dokumentation besagt, dass die gemacht werden können) arbeitete ich es perfekt. Das ist, sagt die Theorie, dass die erste Methode kann ich Header erhalten, aber ich arbeitete, während ich die zweite gearbeitet, aber es gibt den Header und es gibt keine Möglichkeit, sie wiederherzustellen.
Nach einem langen Streit mit Abschluss SOAP und Forschung funktioniert, aber noch keine angekommen, ist es als ob es jemand zufällig, habe ich nicht finden, etwas Sinnvolles. Ich hatte nur eine Lösung, meine eigene Klasse von der ursprünglichen SOAP Antwort auf der Hand Prozess durch die XML-Daten zu erhalten, um die benötigten. Gesagt, getan. Lassen Sie die Lösung.
Zuerst erstelle ich meine eigene Art von SOAP und überprüfen Sie, ob ich tun kann, was ich will.
- SoapClient { XSoapClient Klasse erweitert SoapClient (
- $wsdl , $options ) { public function __construct ($ wsdl, $ options) (
- , $options ) ; parent:: __construct ($ wsdl, $ options);
- )
- $request , $location , $action , $version ) { public function __doRequest ($ request, $ location, $ action, $ version) (
- $request , $location , $action , $version ) ; $ Response = parent:: __doRequest ($ request, $ location, $ action, $ version);
- ; return $ Reaktion;
- )
- )
- XSoapClient ( "http://midominio.com/ws?wsdl" , $par ) ; $ Client = new XSoapClient (http://midominio.com/ws?wsdl ", $ par);
Denke ich werde froh sein, wenn ich perfekt versuchen diese neue SOAP-Client funktioniert, sondern auch, wenn ich den Inhalt von $ response ich sehe, dass enthält den vollständigen XML Webservice Antwort. Wie sehen Sie das einzige was sich ändert ist, dass es instanziieren den Namen der neuen Klasse passiert. Guter Start, wenn ich meine Karten richtig spielen kann ich __doRequest Holen Sie sich die Header in der Methode
.
Lassen Sie uns da diese XML zu bekommen, was wir wollen. Dank der Funktionen DOM und XPath in PHP ist sehr einfach. Dies ist das Ergebnis meines Mandanten Verwertung SOAP-Header:
- SoapClient class SoapClient erstreckt XSoapClient
- (
- $wsdl , $options ) { public function __construct ($ wsdl, $ options) (
- , $options ) ; parent:: __construct ($ wsdl, $ options);
- )
- $request , $location , $action , $version ) { public function __doRequest ($ request, $ location, $ action, $ version) (
- $request , $location , $action , $version ) ; $ Response = parent:: __doRequest ($ request, $ location, $ action, $ version);
- DOMDocument; $ Dom = new DOMDocument;
- ( $response , LIBXML_NOWARNING ) ; $ Dom -> loadXML ($ response, LIBXML_NOWARNING)
- DOMXPath ( $dom ) ; $ Path = new DOMXPath (dom $);
- ( 'soap' , 'http://schemas.xmlsoap.org/soap/envelope/' ) ; $ Pfad -> registerNamespace ('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
- -> query ( '//soap:Header/*' ) ; $ Xml = $ Pfad -> query ('/ / soap: Header / *');
- = $this -> headers2array ( $xml ) ; $ This -> responseHeaders = $ this -> headers2array ($ xml);
- ; return $ Reaktion;
- )
- getResponseHeaders public function () (
- -> responseHeaders ; return $ this -> responseHeaders;
- )
- $response ) { headers2array private function ($ response) (
- $response as $node ) { foreach ($ response as $ node) (
- $node -> hasChildNodes ( ) ) { if ($ node -> hasChildNodes ()) (
- $node -> nodeName ] = $this -> headers2array ( $node -> childNodes ) ; $ Header [$ node -> nodeName] = $ this -> headers2array ($ node -> childNodes);
- { Else ()
- $node -> nodeName ] = $node -> nodeValue ; $ Header [$ node -> nodeName] = $ node -> nodeValue;
- )
- )
- ; return $ headers;
- )
- )
- = new XSoapClient ( "http://midominio.com/ws?wsdl" , $par ) ; lang = <pre "php"> $ client = new XSoapClient (http://midominio.com/ws?wsdl ", $ par);
- -> TuMetodo ( $parametros ) ; $ Result = $ client -> TuMetodo ($ params);
- -> getResponseHeaders ( ) ; Soapheaders $ = $ client -> getResponseHeaders ();
Problem gelöst und sehr elegant. Wenn jemand weiß, wie die Überschriften ohne Montage dieses ganze Durcheinander Sie mir bitte zu erhalten.










3 Mitglieder haben sich auf "Webservices kommentierte: Umgang mit SOAP-Header in PHP"
Feed Kommentare für diesen Eintrag TrackbackIn der Form
$ Client-> __soapCall (EineFunktion ", array ($ a, $ b, $ c), NULL,
SoapHeader new (), $ output_headers)
sollte funktionieren, sonst werden Sie durch eine Besonderheit des Dienstes auf dem Server.
http://www.php.net/manual/es/soapclient.soapcall.php
Bellzebu der Tat ist die Theorie gut
[...] Der Umgang mit SOAP-Header in PHP (2) PHP, Programmierung, technische Nach dem vorherigen Artikel erklärt, wie man die Header in einer SOAP-Antwort zu lesen, habe ich entdeckt, wie man [...] machen
Lassen Sie eine Antwort