为Zend_Soap服务指定SOAP标头

时间:2010-01-08 15:43:46

标签: php zend-framework soap

我已经编写了一个通常直接的Web服务(将代码从同一服务的Java实现转换为ZF,并尝试尽可能保持相同的wsdl结构)。该服务加载PHP类,而不是单个函数。 PHP类包含三个不同的函数。

似乎所有东西都运行得很好,除了我似乎无法弄清楚如何指定给定的函数参数应该作为SOAP标头传递。我在服务器上下文中没有看到任何SOAP标头,只讨论了如何将客户端的头参数传递给服务器。

除了将在SOAP正文中发送并在docblock中详细说明的函数的标准参数之外,我还想指定将在SOAP标头中发送的两个参数(用户名和密码)。

我必须假设这是可能的,但是无法在网上找到任何内容,也没有对Zend论坛上的类似帖子做出任何回应。是否可以在docblock区域中添加一些内容以将参数指定为标题(可能与使用WebParam的方式类似?)?任何关于如何实现这一目标的建议/示例将不胜感激!

1 个答案:

答案 0 :(得分:2)

我自己也遇到了这个问题。我的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的公共方法,然后设置了如果API密钥和站点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?
      }
    }
  }

如果您有更多问题,请告诉我。我很乐意尽我所能。