Nasıl böyle bir sabun başlığı oluşturabilirsiniz?

1 Cevap php

Bazı SOAP'ı yaparken bir 3. parti uygulama çağırır. Onlar uygulama bekliyor ne bir örnek olarak bu sabun başlığı sağlamak. PHP nasıl böyle bir SOAP başlığı oluşturabilirsiniz?

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

Ben ne düşünüyorum doğru bir çağrı yapmak ve hiçbir başlık gönderildiğini karşılığında elde tutmak.

İşte benim kod bir örnek.

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)

Ve bu i geri almak SOAP başlığıdır. (Onun daha ama ben elimden bilgileri uzakta o hassas olabilir)

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

1 Cevap

PHP işleme SOAP başlık aslında çok esnek değil ve ben başlık içinde özellikle kullanımı iki ad alanları imkansız bir SoapHeader-yapısı kullanılarak basitçe başlığını enjekte yapacak söyleyerek kadarıyla gitmek istiyorum Bazı tip.

Ben bunu işlemek için en iyi yolu genişleten özel bir sınıfta SoapClient::__doRequest() geçersiz kılarak XML isteği kendiniz şekillendirmek olduğunu düşünüyorum 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);
    }
}

Daha fazla bilgi ve örnekler için SoapClient::__doRequest bakın.