我是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 生成。这应该不是障碍,因为我会修改它的输出。
感谢您的帮助。
答案 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为前缀。