在PHP中处理SOAP头部信息

3

我正在使用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>

我没有问题让我的SOAPServer处理心跳消息 - $server->addFunction("Heartbeat");运行良好。然而,我希望能够处理<ns1:Header>封装的内容 - 这样我就可以验证API密钥和站点ID,以确保它们是应该的。
我在这里(当然还有其他地方)查看了一下,但回答者似乎错过了问题的要点。有人知道我如何访问头元素进行验证吗?我是否像在正文中添加方法一样为Header添加一个函数?($server->addFunction("Header");?)
非常感谢您的提前帮助。
1个回答

7

找到了!以下是您需要做的。

创建您的SOAP服务器:

$server = new SoapServer($your_wsdl,$any_options);
$server->setClass($name_of_your_class);
$server->handle($location_of_request_data);

$name_of_your_class 中定义的类除了包含在 $your_wsdl 中定义的每个服务函数外,还应该包含一个与你的 <SOAP-ENV:Header> 标签封闭体中相同的名称的函数。 我的是 <ns1:Header>,所以我的函数名为 Header。在其中放入您需要的任何逻辑。 对我来说,我想要验证 API 密钥和站点 ID,因此我创建了一个私有变量,如果 API 密钥和站点 ID 正确,则将变量设置为 true。 类中的所有其他函数在继续之前都会检查该变量是否为 true,如果不是,则抛出 SOAPFault

希望这能帮助到在 Google 上遇到此问题的任何人。

P.S.:对于在 $server->setClass() 中定义的类中的函数,请不要忘记它们必须按照 WSDL 中定义的顺序接受参数。 这让我困惑了。

祝所有其他 PHP/SOAP 开发人员好运 - 看起来我们都需要它。

编辑/P.P.S.:由于某种原因,仅调用 $server->addFunction("Header") 对我没有起作用 - 我在尝试上述的 setClass 方法之前首先尝试了这种方法。 这只是提醒大家。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接