python suds errado prefixo de namespace na solicitação SOAP
Eu uso python / suds para implementar um cliente e recebo prefixos de espaço de nomes incorretos no cabeçalho SOAP enviado para um tipo de parâmetro de parâmetros definido porelement ref=
no wsdl.
O .wsdl está referenciando um arquivo .xsd de tipos de dados, veja abaixo. A questão é com a funçãoGetRecordAttributes
e seu primeiro argumento do tipogbt:recordReferences
.
Arquivo: 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>
Arquivo referenciado: grantabasetypes2.xsd
<element name="recordReferences">
<complexType>
<sequence>
<element name="record" minOccurs="0" maxOccurs="unbounded" type="gbt:MIRecordReference"/>
</sequence>
</complexType>
</element>
Solicitação SOAP enviada por suds:
<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>
Problema : <ns2:recordReferences>
tem prefixo errado, deve ser<ns0:recordReferences>
já que pertence ao namespace...GrantaBaseTypes
definido no .xsd.
Isso acontece para todos os argumentos definidos porref=
no wsdl. Como isso pode ser corrigido automaticamente?
Nota: verifiquei se o prefixo "bom" é aceito pelo serviço enviando manualmente a solicitação xml SOAP por meio de curl.
ATUALIZAR
Eu me intrometi com o código fonte do SUDS e a seguinte correção empírica força todos os elementos comref=
atributo para assumir o namespace ref-ed (anteriormente, eles assumem o namespace da raiz do esquema ou o que fortns
é):
Arquivo: /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
Funciona com o meu serviço, mas não tenho certeza se isso quebrará outras coisas. Eu preferiria uma solução mais inteligente que não altere o código-fonte do SUDS.
Obrigado,
Alex