2009-03-27 6 views
3

Faire des appels SOAP à une application tierce. Ils fournissent cet en-tête de savon comme un exemple de ce que l'application attend. Comment puis-je créer un en-tête SOAP comme celui-ci en PHP?Comment puis-je créer un en-tête de savon comme celui-ci?

<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> 

Je fais ce que je pense être un appel correct et continue d'obtenir en retour qu'aucun en-tête n'a été envoyé.

Voici un exemple de mon 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) 

Et c'est l'en-tête SOAP que je récupère. (Son plus mais je dépouillèrent informations loin qui pourraient être sensibles)

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

N'existe-t-il pas de bibliothèques PHP pour la gestion SOAP, qui peuvent générer des objets PHP et des interfaces de service à partir du WSDL/XSD pour le service Web? – JeeBee

+0

J'utilise la bibliothèque SOAPClient en PHP. –

Répondre

3

manipulation en-tête SOAP en PHP est en fait pas très flexible et j'irais jusqu'à dire que en particulier l'utilisation de deux espaces de noms dans l'en-tête fera il est impossible d'injecter l'en-tête simplement en utilisant un SoapHeader -construit d'un certain type.

Je pense que la meilleure façon de gérer celui-ci est de façonner la demande XML en remplaçant SoapClient::__doRequest() dans une classe personnalisée qui s'étend SoapClient.

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); 
    } 
} 

Veuillez consulter SoapClient::__doRequest pour plus d'informations et quelques exemples.

+0

J'ai fini par créer mon propre en-tête, mais avec nuSOAP, mais votre réponse m'a conduit dans le bon sens. :) –

Questions connexes