如何将名称空间添加到返回WSDL / SOAP的所有元素

时间:2012-06-14 10:12:04

标签: php zend-framework soap wsdl zend-soap

我是SOAP和WSDL世界的新手。我该怎么做才能确保命名空间始终位于return-element中?

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://someurl.com">
    <SOAP-ENV:Body>
        <ns1:sayHelloResponse>
            <return>Say Hello Kelvin</return>
        </ns1:sayHelloResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我想要的是:

<ns1:sayHelloResponse>
    <ns1:return>Say Hello Kelvin</ns1:return>
</ns1:sayHelloResponse>

我正在使用PHP和Zend Framework。 WSDL由 Zend_Soap_AutoDiscovery 生成。这应该不是障碍,因为我会修改它的输出。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

休息一会儿后,我又一次解决了这个问题。 这一次,我偶然发现了这个不错的article(归功于我以前的同事迈克)。如果未在架构标记中声明属性 elementFormDefault ,则将unqualified视为其值。通过给它“合格”的值,将发生以下情况:

  

但是如果将elementFormDefault =“qualified”添加到document / literal包装的WSDL中的所有模式中,那么消息中的所有元素都将使用其父级命名空间进行限定。

     

一般情况下,您不希望使用elementFormDefault =“qualified”   因为它膨胀了消息,但是一年或更久以前有消息   各供应商之间的互操作性问题,并设置此问题   属性有时会解决问题。

即使我没有使用document / literal,我也想尝试一下。我将该属性添加到架构标记中,并向另一个调用发出请求。这是我得到的回应:

  <ns1:getUserResponse>
     <return>
        <ns1:firstname>First</ns1:firstname>
        <ns1:lastname>Last</ns1:lastname>
     </return>
  </ns1:getUserResponse>

正如您所看到的,“return”元素的子元素以名称空间为前缀。 在这一点上,我非常兴奋,因为我终于接近了我想要的地方。 不幸的是,return元素没有前缀名称空间。我再次尝试了之前的调用(请参阅问题帖子),但响应与以前相同。

我不能在这个问题上花更多的时间。毕竟这只是一个原型。 这就是为什么我决定挂钩Zend_Soap_Server的句柄函数,在输出之前修改响应。

class Custom_Soap_Server extends Zend_Soap_Server 
{
    public function __construct($wsdl = null, array $options = null)
    {
        parent::__construct($wsdl, $options);

        // Response of handle will always be returned
        $this->setReturnResponse(true); 
    }

    public function handle($request = null)
    {
        $response = parent::handle($request);
        echo str_replace(array('<return>', '</return>'), array('<ns1:return>', '</ns1:return>'), $response);
        return;
    }
}

说实话,这是一个讨厌的黑客。我总是假设只有一个命名空间。替换功能可以写得更好。但毕竟这是一个原型,这是我第一次想到让它发挥作用。

使用新的自定义类而不是Zend_Soap_Server后,所有返回元素都以ns1为前缀。