使用php在非wsdl soap客户端中设置xml rquest头

时间:2016-06-29 06:40:56

标签: php soap wsdl soapheader

我正在尝试使用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”,则会导致其无效并发出错误

提前感谢您的帮助。

请注意,我已故意更改了网址和密码,因为我无法透露这些内容。

1 个答案:

答案 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);