python suds falsches Namespace-Präfix in SOAP-Anfrage
Ich verwende python / suds, um einen Client zu implementieren, und ich erhalte falsche Namespace-Präfixe im gesendeten SOAP-Header für einen bestimmten Parametertyp, der von definiert wirdelement ref=
in der wsdl.
Die .wsdl-Datei verweist auf eine .xsd-Datei des Datentyps (siehe unten). Das Problem ist mit der FunktionGetRecordAttributes
und sein erstes typisches Argumentgbt:recordReferences
.
Datei: 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>
Referenzierte Datei: grantabasetypes2.xsd
<code><element name="recordReferences"> <complexType> <sequence> <element name="record" minOccurs="0" maxOccurs="unbounded" type="gbt:MIRecordReference"/> </sequence> </complexType> </element> </code>
SOAP-Anfrage von suds gesendet:
<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>
Problem : <ns2:recordReferences>
hat falsches Präfix, sollte sein<ns0:recordReferences>
da es zum Namespace gehört...GrantaBaseTypes
definiert in der .xsd.
Dies geschieht für alle durch definierten Argumenteref=
in der wsdl. Wie kann dies automatisch behoben werden?
Hinweis: Ich habe überprüft, ob das Präfix "good" vom Dienst akzeptiert wird, indem ich die XML-SOAP-Anforderung manuell per Curl gesendet habe.
AKTUALISIEREN
Ich habe mich in SUDS-Quellcode eingemischt und der folgende empirische Fix erzwingt alle Elemente mitref=
Attribut, um den überarbeiteten Namespace anzunehmen (zuvor übernehmen sie den Stammnamespace des Schemas oder was auch immer)tns
ist):
Datei: /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>
Funktioniert mit meinem Service, aber ich bin nicht sicher, ob es andere Dinge kaputt macht. Ich würde eine intelligentere Lösung bevorzugen, die den SUDS-Quellcode nicht ändert.
Vielen Dank,
Alex