为Zend_Soap服务指定SOAP标头

5 php soap zend-framework

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

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

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

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

ben*_*njy 2

我自己刚刚遇到了这个问题。我的 SOAP 请求的结构如下:

<SOAP-ENV:Envelope>
  <SOAP-ENV:Header>
    <Header>
      <APIKey>$key</APIKey>
      <SiteID>$id</SiteID>
    </Header>
  </SOAP-ENV:HEADER>
  (body)
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)

因为我的标签内容<SOAP-ENV:Header>位于附件中,所以我在实例加载的<Header>类中创建了一个公共方法,然后如果 API 密钥和站点 ID 有效,则将私有类变量设置为 true。我的类中处理请求正文的其他方法然后在继续之前检查该变量是否为 true。丑陋,我知道,但正如你提到的,没有文档,这似乎是最简单的方法。它看起来像这样:SoapServerHeader

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?
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

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