代码之家  ›  专栏  ›  技术社区  ›  Ólafur Waage

如何创建这样的soap头?

  •  3
  • Ólafur Waage  · 技术社区  · 15 年前

    对第三方应用程序执行一些SOAP调用。它们提供这个soap头作为应用程序期望的示例。如何在PHP中创建这样的SOAP头?

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

    这是我代码中的一个示例。

    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)
    

    这是我得到的SOAP标题。(更多,但我删除了可能敏感的信息)

    <SOAP-ENV:Header>
        <ns2:TUsernameToken>
            <Username>username</Username> 
            <Password>password</Password> 
        </ns2:TUsernameToken>
    </SOAP-ENV:Header>
    
    1 回复  |  直到 15 年前
        1
  •  3
  •   Stefan Gehrig    15 年前

    PHP中的SOAP头处理实际上不是很灵活,我甚至可以说,特别是在头中使用两个名称空间将使仅仅使用 SoapHeader

    SoapClient::__doRequest() 在扩展的自定义类中 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);
        }
    }
    

    请看 SoapClient::__doRequest 以获取更多信息和一些示例。