基于PHP的SOAP头文件如何生成特定的格式?

问题描述:

我想生成以下SOAP头格式,基于PHP的SOAP头文件如何生成特定的格式?

<soapenv:Header> 
    <SoapHeaderMsg xmlns="http://xyz.com.au"> 
     <opt:UserSoapHeader> 
      <opt:IdentityName>TEST</opt:IdentityName> 
      <opt:AuthenticationToken>jjjkjkjkjkjkj</opt:AuthenticationToken> 
     </opt:UserSoapHeader> 
    </SoapHeaderMsg> 
</soapenv:Header> 

所以我用下面的PHP函数生成此,

$this->__setSoapHeaders(array(
      new SoapHeader('http://xyz.com.au', 'SoapHeaderMsg', array(
       new SoapHeader('http://xyz.com.au', 'IdentityName', 'TEST'), 
       new SoapHeader('http://xyz.com.au', 'AuthenticationToken', 'jkjkjkk') 
      )), 
     )); 

产生以下标题这是完全不同的,以我想要的以上 ?我如何使用上面的PHP函数生成完全相同的头文件?

<SOAP-ENV:Header> 
     <ns1:SoapHeaderMsg> 
      <SOAP-ENC:Struct> 
       <namespace>http://xyz.com.au</namespace> 
       <name>IdentityName</name> 
       <data>TEST</data> 
       <mustUnderstand>false</mustUnderstand> 
      </SOAP-ENC:Struct> 
      <SOAP-ENC:Struct> 
       <namespace>http://xyz.com.au</namespace> 
       <name>AuthenticationToken</name> 
       <data>hjhhjjhjhjhj</data> 
       <mustUnderstand>false</mustUnderstand> 
      </SOAP-ENC:Struct> 
     </ns1:SoapHeaderMsg> 
    </SOAP-ENV:Header> 

array主要用于在PHP端,其被转换到Struct。你可以请尝试使用object,看看你是否有任何成功。

$this->__setSoapHeaders(array(
     new SoapHeader('http://xyz.com.au', 'SoapHeaderMsg', 
      (object)array( 
       'opt:UserSoapHeader' => (object)array(
        'opt:IdentityName' => 'TEST', 
        'opt:AuthenticationToken' => 'jkjkjkk' 
       ) 
     )), 
    )); 

请求看起来像下面:

<?xml version="1.0" encoding="utf-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:ns1="http://test.domain.com/" 
        xmlns:ns2="http://xyz.com.au"> 
     <SOAP-ENV:Header> 
     <ns2:SoapHeaderMsg> 
       <opt:UserSoapHeader> 
        <opt:IdentityName>TEST</opt:IdentityName> 
        <opt:AuthenticationToken>jkjkjkk</opt:AuthenticationToken> 
       </opt:UserSoapHeader> 
     </ns2:SoapHeaderMsg> 
     </SOAP-ENV:Header> 
     <SOAP-ENV:Body> 
      ...... 
     </SOAP-ENV:Body> 
</SOAP-ENV:Envelope>