我对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 前缀。