【问题标题】:How to add the namespace to all elements that get returned WSDL / SOAP如何将命名空间添加到返回 WSDL/SOAP 的所有元素
【发布时间】:2012-06-14 10:12:04
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    休息了一会儿,我再次接近这个问题。 不过这一次,我偶然发现了这个不错的article(感谢我的前同事迈克)。如果未在模式标记中声明属性 elementFormDefault,则假定其值为 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;
        }
    }
    

    说实话,这是一个令人讨厌的 hack。我总是假设只有一个命名空间。替换函数可以写得更好。但毕竟这是一个原型,这是我第一个想到让它工作的想法。

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

    【讨论】:

    • 您是否遇到过修改后的 SOAP 响应被切断的情况。例如 &lt;SOAP-ENV:Envel 而不是 &lt;SOAP-ENV:Envelope&gt;。我想这与通过str_replace 方法向SOAP 响应添加字符有关。 SOAP 响应长度设置在哪里?
    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2017-11-27
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多