我编写了一个通常简单明了的Web服务(将相同服务的Java实现中的代码转换为ZF,并尝试尽可能地维护相同的wsdl结构)。该服务加载一个PHP类,而不是单个函数。 PHP类中包含三个不同的函数。
一切似乎都工作正常,除了我似乎无法弄清楚如何指定应将给定的函数参数作为SOAP header 传递。我没有在服务器上下文中看到任何有关SOAP header 的信息,只是如何将 header 参数与客户端一起传递给服务器。
除了将在SOAP正文中发送并在docblock中详细说明的函数的标准参数外,我还要指定将在SOAP header 中发送的两个参数(用户名和密码)。
我必须假设这是可能的,但是还无法在线找到任何东西,也没有对Zend论坛上类似帖子的任何回应。是否可以在docblock区域中添加某些内容以将参数指定为 header (也许类似于使用WebParam的方式?)?任何有关如何实现这一目标的建议/示例,将不胜感激!
最佳答案
我自己碰到了这个问题。我的SOAP请求的结构如下:
<SOAP-ENV:Envelope>
<SOAP-ENV:Header>
<Header>
<APIKey>$key</APIKey>
<SiteID>$id</SiteID>
</Header>
</SOAP-ENV:HEADER>
(body)
</SOAP-ENV:Envelope>
因为
<SOAP-ENV:Header>
标记的内容在<Header>
附件中,所以我在SoapServer
实例加载的类Header
中创建了一个公共(public)方法,该方法将私有(private)类变量设置为true(如果API key 和站点ID有效)。我类中处理请求正文的其他方法然后在继续之前检查该变量是否为true。丑陋,我知道,但是正如您提到的,没有文档,这似乎是最简单的方法。看起来像这样:class MySoapRequestHandler
{
private $authenticated;
public function Header($data)
{
//your logic here
if($request_is_valid)
{
$this->authenticated = true;
}
else
{
$this->authenticated = false;
}
}
public function ProcessBody($data) //of course named whatever your body element is named
{
if($this->authenticated === true)
{
//process the request
}
else
{
//throw a soap fault?
}
}
}
如果您还有其他问题,请告诉我;很乐意尽我所能。