我正在尝试使用php进行非wsdl SOAP客户端调用。我的代码是这样的:
<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>
如果我调试并查看xml的Last request header部分,它看起来像这样:
<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文件,那么xml标题如下所示:
{{1}}
如何使用非wsdl SOAP客户端调用使标题部分如上所示?因为“如果AuthenticateClient Soap Header Request中没有提供UserName Token或UserName”,则会导致其无效并发出错误
提前感谢您的帮助。
请注意,我已故意更改了网址和密码,因为我无法透露这些内容。
答案 0 :(得分:2)
您可以手动创建标题的一部分并将其插入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);