soapclient library extension php soap

library - soap request php



¿Cómo puedo crear un encabezado de jabón como este? (1)

Hacer algunas llamadas SOAP a una aplicación de terceros. Proporcionan este encabezado de soap como un ejemplo de lo que espera la aplicación. ¿Cómo puedo crear un encabezado SOAP como este en PHP?

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

Hago lo que creo que es una llamada correcta y sigo obteniendo a cambio que no se hayan enviado encabezados.

Aquí hay una muestra de mi código.

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)

Y este es el encabezado SOAP que recibo. (es más, pero eliminé información que podría ser sensible)

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


El manejo del encabezado SOAP en PHP no es muy flexible y llegaría a decir que especialmente el uso de dos espacios de nombres dentro del encabezado impedirá inyectar el encabezado simplemente usando un SoapHeader -construct de algún tipo.

Creo que la mejor manera de manejar esto es dar forma a la solicitud XML usted mismo anulando SoapClient::__doRequest() en una clase personalizada que amplíe 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); } }

Por favor, consulte SoapClient::__doRequest para obtener más información y algunos ejemplos.