在PHP中处理SOAP标头

ben*_*njy 3 php soap soapserver

我正在构建(在PHP中)一个SOAP服务器,该服务器由其WSDL配置为接受如下所示的消息:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://my.awesome.namespace/">
    <SOAP-ENV:Header>
        <ns1:Header>
            <ns1:APIKey>E4C5BDE0-48DC-543C-1CA3-8E55C63F8E60</ns1:APIKey>
            <ns1:SiteID>111</ns1:SiteID>
        </ns1:Header>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:Heartbeat>
            <ns1:Message>Hello world.</ns1:Message>
        </ns1:Heartbeat>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)

我没有问题让我的SOAPServer处理Heartbeat消息 - $server->addFunction("Heartbeat");工作正常.但是,我希望能够处理<ns1:Header>机箱的内容- 因此我可以验证API密钥和站点ID,以确保它们应该是什么.

我看了这里,(当然还有其他地方),但响应者似乎错过了问题的重点.有谁知道我如何访问标题元素来验证?我是否可以像在身体中使用方法一样为Header添加函数?($server->addFunction("Header");?)

首先十分感谢.

ben*_*njy 7

找到了!这是你做的.

创建SOAP服务器:

$server = new SoapServer($your_wsdl,$any_options);
$server->setClass($name_of_your_class);
$server->handle($location_of_request_data);
Run Code Online (Sandbox Code Playgroud)

$name_of_your_class除了包含定义的每个服务的函数之外,命名的类$your_wsdl还应包含一个以<SOAP-ENV:Header>标记框中的任何名称命名的函数.我有<ns1:Header>,所以我的功能被命名Header.把你需要的逻辑放在那里.对于我来说,我想验证API密钥和网站ID,所以我创建了一个私有变量,如果API密钥和站点ID是正确的,该变量设置为true.类中的所有其他函数在继续之前检查该变量是否为true,如果不是,SOAPFault则抛出a.

希望这有助于在Google上遇到此问题的任何人.

PS:对于定义的类中的函数$server->setClass(),不要忘记它们必须按WSDL中定义的顺序接受参数.那让我失望了.

祝所有其他PHP/SOAP开发人员好运 - 似乎我们都需要它.

编辑/ PPS:无论出于何种原因,简单地调用$server->addFunction("Header")对我来说都不起作用 - 我在尝试上述setClass方法之前先尝试过.只是与人们对决.