2012-11-20 14 views
13

PHP SoapClient-Header. Ich habe ein Problem beim Abrufen der Namespaces in untergeordneten Knoten. Hier ist der Code Ich verwende:PHP-Namespaces in SoapHeader Child-Knoten

$security = new stdClass; 
$security->UsernameToken->Password = 'MyPassword'; 
$security->UsernameToken->Username = 'MyUsername'; 
$header[] = new SOAPHeader('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'Security', $security); 
$client->__setSoapHeaders($header); 

Hier ist das XML erzeugt sie:

<ns2:Security> 
    <UsernameToken> 
    <Password>MyPassword</Password> 
    <Username>MyUsername</Username> 
    </UsernameToken> 
</ns2:Security> 

Hier ist der XML ich es will generieren:

<ns2:Security> 
    <ns2:UsernameToken> 
    <ns2:Password>MyPassword</ns2:Password> 
    <ns2:Username>MyUsername</ns2:Username> 
    </ns2:UsernameToken> 
</ns2:Security> 

Ich brauche den Namespace zu erhalten Referenz in die UsernameToken-, Password- und Username-Knoten. Jede Hilfe würde wirklich geschätzt werden.

Danke.

Antwort

9

Ich habe es herausgefunden. Ich habe verschachtelte SoapVars und Arrays verwendet.

$ns_s = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'; 
$node1 = new SoapVar('MyUsername', XSD_STRING, null, null, 'Username', $ns_s); 
$node2 = new SoapVar('MyPassword', XSD_STRING, null, null, 'Password', $ns_s); 
$token = new SoapVar(array($node1,$node2), SOAP_ENC_OBJECT, null, null, 'UsernameToken', $ns_s); 
$security = new SoapVar(array($token), SOAP_ENC_OBJECT, null, null, 'Security', $ns_s); 
$header[] = new SOAPHeader($ns_s, 'Security', $security, false); 

, die vollständig zu viel Mühe und Gedanken nahm ...

11

David hat die right answer. Und er hat auch Recht, dass es viel zu viel Aufwand und Gedanke dauert. Hier ist eine Variation, die die Hässlichkeit für jeden, der diesen speziellen Wesse Security Header bearbeitet, kapselt.

reinigen Client-Code

$client = new SoapClient('http://some-domain.com/service.wsdl'); 
$client->__setSoapHeaders(new WSSESecurityHeader('myUsername', 'myPassword')); 

Und die Umsetzung ...

class WSSESecurityHeader extends SoapHeader { 

    public function __construct($username, $password) 
    { 
     $wsseNamespace = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'; 
     $security = new SoapVar(
      array(new SoapVar(
       array(
        new SoapVar($username, XSD_STRING, null, null, 'Username', $wsseNamespace), 
        new SoapVar($password, XSD_STRING, null, null, 'Password', $wsseNamespace) 
       ), 
       SOAP_ENC_OBJECT, 
       null, 
       null, 
       'UsernameToken', 
       $wsseNamespace 
      )), 
      SOAP_ENC_OBJECT 
     ); 
     parent::SoapHeader($wsseNamespace, 'Security', $security, false); 
    } 

} 
+0

Dank ich diese verwendet, aber verändert das Passwort Abschnitt: neue SoapVar ($ password, XSD_STRING, 'type', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText', 'Passwort', $ wsseNamespace)), Was gibt dir: dein passwort Craig