我使用 python/suds 来实现客户端,但在发送的 SOAP 标头中,element ref=
对于 wsdl 中定义的特定类型的参数,我得到了错误的命名空间前缀。
.wsdl 引用数据类型 .xsd 文件,见下文。问题在于函数GetRecordAttributes
及其类型的第一个参数gbt:recordReferences
。
文件:browse2.wsdl
<xsd:schema targetNamespace="http://www.grantadesign.com/10/10/Browse" xmlns="http://www.grantadesign.com/10/10/Browse" xmlns:gbt="http://www.grantadesign.com/10/10/GrantaBaseTypes" elementFormDefault="qualified" attributeFormDefault="qualified">
<xsd:import schemaLocation="grantabasetypes2.xsd" namespace="http://www.grantadesign.com/10/10/GrantaBaseTypes"/>
<xsd:element name="GetRecordAttributes">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="gbt:recordReferences">
</xsd:element>
参考文件:grantabasetypes2.xsd
<element name="recordReferences">
<complexType>
<sequence>
<element name="record" minOccurs="0" maxOccurs="unbounded" type="gbt:MIRecordReference"/>
</sequence>
</complexType>
</element>
由 suds 发送的 SOAP 请求:
<SOAP-ENV:Envelope xmlns:ns0="http://www.grantadesign.com/10/10/GrantaBaseTypes" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://www.grantadesign.com/10/10/Browse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns1:Body>
<ns2:GetRecordAttributes>
<ns2:recordReferences>
<ns0:record>
</ns0:record>
</ns2:recordReferences>
</ns2:GetRecordAttributes>
</ns1:Body>
</SOAP-ENV:Envelope>
问题: <ns2:recordReferences>
前缀错误,应该是 <ns0:recordReferences>
因为它属于...GrantaBaseTypes
.xsd 中定义的命名空间。
这发生ref=
在 wsdl 中定义的所有参数上。如何自动修复?
注意:我通过 curl 手动发送 xml SOAP 请求来检查服务是否接受了“好”前缀。
更新
我干预了 SUDS 源代码,下面的经验修复强制所有具有ref=
属性的元素假定 ref-ed 命名空间(以前,它们采用模式根命名空间或其他任何东西tns
):
文件:/suds/xsd/sxbase.py
class SchemaObject(object):
....
def namespace(self, prefix=None):
ns = self.schema.tns
#FIX BEGIN
if self.ref and self.ref in self.schema.elements.keys():
ns = self.ref
#FIX END
适用于我的服务,但我不确定它是否会破坏其他东西。我更喜欢不更改 SUDS 源代码的更智能的解决方案。
谢谢,
亚历克斯