2009-03-27 7 views
3

Einige SOAP-Aufrufe an eine Drittanbieteranwendung ausführen. Sie liefern diesen Soap-Header als ein Beispiel für das, was die Anwendung erwartet. Wie kann ich einen solchen SOAP-Header in PHP erstellen?Wie kann ich so einen Soap-Header erstellen?

<SOAP-ENV:Header> 
    <NS1:Security xsi:type="NS2:Security" xmlns:NS1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:NS2="urn:dkWSValueObjects"> 
     <NS2:UsernameToken xsi:type="NS2:TUsernameToken"> 
      <Username xsi:type="xsd:string">XXXX</Username> 
      <Password xsi:type="xsd:string">XXX</Password> 
     </NS2:UsernameToken> 
    </NS1:Security> 
</SOAP-ENV:Header> 

ich tue, was ich denke, ein richtiger Anruf und halte im Gegenzug bekommen, dass keine Header gesendet wurden.

Hier ist ein Beispiel aus meinem Code.

class SOAPStruct 
{ 
    function __construct($user, $pass) 
    { 
     $this->Username = $user; 
     $this->Password = $pass; 
    } 
} 

$client = new SoapClient("http://www.example.com/service"); 

$auth = new SOAPStruct("username", "password"); 
$header = new SoapHeader("http://example.com/service", "TUsernameToken", $auth); 

$client->__setSoapHeaders(array($header)); 
$client->__soapCall("GetSubscriptionGroupTypes", array(), NULL, $header) 

Und das ist der SOAP-Header, den ich zurückbekomme. (Seine mehr, aber ich gestrippt Informationen weg, die empfindlich sein könnte)

<SOAP-ENV:Header> 
    <ns2:TUsernameToken> 
     <Username>username</Username> 
     <Password>password</Password> 
    </ns2:TUsernameToken> 
</SOAP-ENV:Header> 
+0

Gibt es keine PHP-Bibliotheken für die SOAP-Behandlung, die PHP-Objekte und Service-Schnittstellen aus der WSDL/XSD für den Web-Service generieren können? – JeeBee

+0

Ich verwende die SOAPClient-Bibliothek in PHP. –

Antwort

3

SOAP-Header in PHP Umgang ist eigentlich nicht sehr flexibel und ich würde so weit gehen, wie zu sagen, dass vor allem die Verwendung zwei Namensräume im Header machen Es ist unmöglich, den Header einfach mit einem SoapHeader-Konstrukt eines Typs zu injizieren.

Ich denke, der beste Weg, um dies zu handhaben ist, um die XML-Anfrage selbst durch Überschreiben SoapClient::__doRequest() in einer benutzerdefinierten Klasse, die SoapClient erweitert.

class My_SoapClient extends SoapClient 
{ 
    public function __doRequest($request, $location, $action, $version, $one_way = 0) 
    { 
     $xmlRequest = new DOMDocument('1.0'); 
     $xmlRequest->loadXML($request); 

     /* 
     * Do your processing using DOM 
     * e.g. insert security header and so on 
     */ 

     $request = $xmlRequest->saveXML(); 
     return parent::__doRequest($request, $location, $action, $version, $one_way); 
    } 
} 

Weitere Informationen und Beispiele finden Sie unter SoapClient::__doRequest.

+0

Ich habe am Ende meinen eigenen Header erstellt, aber mit NuSOAP, aber deine Antwort hat mich auf dem richtigen Weg geführt. :) –

Verwandte Themen