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 处理 Heartbeat 消息没有问题 -$server->addFunction("Heartbeat");工作正常。但是,我希望能够处理<ns1:Header>附件中的内容——这样我就可以验证 API 密钥和站点 ID 以确保它们是应有的。

我看了这里,(当然还有其他地方),但响应者似乎错过了问题的重点。有谁知道我如何访问标题元素进行验证?我是否像在正文中添加方法一样为 Header 添加功能?( $server->addFunction("Header");?)

首先十分感谢。

4

1 回答 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。类中的所有其他函数在继续之前检查该变量是否为真,如果不是,SOAPFault则抛出 a。

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

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

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

编辑/PPS:无论出于何种原因,简单的调用$server->addFunction("Header")对我来说都不起作用——在我尝试上述setClass方法之前,我先尝试了这一点。只是给人们提个醒。

于 2009-12-22T22:18:53.733 回答