我编写了一个通常简单明了的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?
      }
    }
  }

如果您还有其他问题,请告诉我;很乐意尽我所能。

10-07 12:21