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


How to add the namespace to all elements that get returned WSDL / SOAP

我对SOAP和WSDL世界相当陌生。我必须做什么,以确保命名空间始终在返回元素中?

<?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 生成。不过,这不应该是一个障碍,因为我无论如何都会修改它的输出。

感谢您的帮助。

休息了一会儿后,我再次解决了这个问题。不过这一次,我偶然发现了这篇不错的文章(感谢我的前同事迈克)。如果未在架构标记中声明属性元素 FormDefault,则假定 unqualified 为其值。通过赋予它值"合格",将发生以下情况:

但是,如果将 elementFormDefault="qualified" 添加到文档/文字包装的 WSDL 中的所有模式中,则消息中的所有元素都将使用其父级的命名空间进行限定。

通常,您不想使用 elementFormDefault="qualified" 因为它使消息膨胀,但一年或更长时间前有 不同供应商之间的互操作性问题,以及设置此问题 属性有时可以解决问题。

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

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

如您所见,"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 前缀。