Python suds mal nombre de prefijo en la solicitud SOAP
Utilizo python / suds para implementar un cliente y recibo prefijos de espacio de nombres incorrectos en el encabezado SOAP enviado para un tipo de parámetros definido porelement ref=
en el wsdl.
.Wsdl hace referencia a un archivo .xsd de tipos de datos, consulte a continuación. El problema es con la función.GetRecordAttributes
y su primer argumento de tipo.gbt:recordReferences
.
Archivo: browse2.wsdl
<code><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> </code>
Archivo de referencia: grantabasetypes2.xsd
<code><element name="recordReferences"> <complexType> <sequence> <element name="record" minOccurs="0" maxOccurs="unbounded" type="gbt:MIRecordReference"/> </sequence> </complexType> </element> </code>
Solicitud de SOAP enviada por suds:
<code><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> </code>
Problema : <ns2:recordReferences>
tiene un prefijo incorrecto, debería ser<ns0:recordReferences>
ya que pertenece al espacio de nombres...GrantaBaseTypes
definido en el .xsd.
Esto sucede para todos los argumentos definidos porref=
en el wsdl. ¿Cómo se puede arreglar esto automáticamente?
Nota: Verifiqué que el prefijo "bueno" es aceptado por el servicio mediante el envío manual de la solicitud SOAP xml a través de curl
ACTUALIZAR
Me mezclé con el código fuente de SUDS y la siguiente solución empírica obliga a todos los elementos conref=
atributo para asumir el espacio de nombres ref-ed (anteriormente, toman el espacio de nombres de la raíz del esquema o lo que seatns
es):
Archivo: /suds/xsd/sxbase.py
<code>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 </code>
Funciona con mi servicio, pero no estoy seguro si romperá otras cosas. Preferiría una solución más inteligente que no cambie el código fuente de SUDS.
Gracias,
Alex