2016-06-29 48 views
0

我正在嘗試使用php進行非wsdl SOAP客戶端調用。我的代碼是這樣的:在非wsdl soap客戶端中使用php設置xml rquest頭php

try { 
$URL = 'http://example.com/webservices/security/accesscontrol.asmx'; 

$sc = new SoapClient(null, array(
    'location' => $URL, 
    'uri' => 'http://example.com/webservices/security/', 
    'trace' => 1 
)); 

$usertoken = array('UserNameToken' => 
array(
    'UserName' => 'test', 
    'Password' => 'test123' 
)); 

$header = new SoapHeader('http://www.docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'Security', $usertoken); 

$sc->__setSoapHeaders($header); 

$test = $sc->__soapCall("AuthenticateClient", 
    array(), 
    array('soapaction' => 'http://example.com/webservices/security/AuthenticateClient') 
); 

如果我調試,看看最後的請求頭XML的一部分,它看起來像這樣:

<SOAP-ENV:Header> 
    <ns2:Security> 
     <item><key>UserNameToken</key><value><item><key>UserName</key><value>test</value></item><item><key>Password</key><value>test123</value></item></value></item> 
    </ns2:Security> 
</SOAP-ENV:Header> 

但是,如果使用WSDL文件,XML頭的樣子這個:

<SOAP-ENV:Header> 
    <ns2:Security> 
     <ns2:UserNameToken> 
      <ns2:UserName>test</ns2:UserName> 
      <ns2:Password>test123</ns2:Password> 
     </ns2:UserNameToken> 
    </ns2:Security> 
</SOAP-ENV:Header> 

如何使用非wsdl SOAP客戶端調用來使頭部像上面那樣?因爲它不起作用,並給出由「如果用戶名令牌或用戶名未在AuthenticateClient肥皂標題請求中提供」而導致的錯誤

在此先感謝您的幫助。

請注意,我已故意更改了URL和密碼,因爲我無法透露它們。

回答

1

您可以手動創建頭的一部分,並把它插入到SOAPHEADER,嘗試做這樣的事情:

$URL = 'http://example.com/webservices/security/accesscontrol.asmx'; 

    $soapClient = new SoapClient(null, array(
     'location' => $URL, 
     'uri' => 'http://example.com/webservices/security/', 
     'trace' => 1 
    )); 

    $headerPart = ' 
      <SOAP-ENV:Header> 
       <ns2:Security> 
        <ns2:UserNameToken> 
         <ns2:UserName>DASKO</ns2:UserName> 
         <ns2:Password>welcome1</ns2:Password> 
        </ns2:UserNameToken> 
       </ns2:Security> 
      </SOAP-ENV:Header> 
    '; 

    $soapVarHeader = new SoapVar($headerPart, XSD_ANYXML, null, null, null); 

    $header = new SoapHeader(
     'http://www.docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', // Namespace - namespace of the WebService 
     'Security', 
     $soapVarHeader, 
     false // mustunderstand 
    ); 

    $soapClient->__setSoapHeaders($header); 
+0

感謝丹尼爾。它工作完美。 –