Ich benutze Python/Suds, um einen Client zu implementieren, und ich bekomme falsche Namespacepräfixe in der gesendeten SOAP-Header für eine spezifische Art von Parametern von element ref=
in der WSDL definiert.Python verschmutzt falsche Namespacepräfix in SOAP-Anfrage
Die .wsdl verweist auf eine .xsd-Datei mit Datentypen, siehe unten. Das Problem tritt mit der Funktion GetRecordAttributes
und ihrem ersten Argument vom Typ gbt:recordReferences
auf.
Datei: 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>
referenzierte Datei: grantabasetypes2.xsd
<element name="recordReferences">
<complexType>
<sequence>
<element name="record" minOccurs="0" maxOccurs="unbounded" type="gbt:MIRecordReference"/>
</sequence>
</complexType>
</element>
SOAP-Anforderung von Schaum gesendet:
<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>
Problem: <ns2:recordReferences>
hat ein falsches Präfix, sollte <ns0:recordReferences>
sein, da es zum Namespace ...GrantaBaseTypes
gehört, der in der .xsd definiert ist.
Dies geschieht für alle Argumente, die von ref=
in der WSDL definiert sind. Wie kann dies automatisch behoben werden?
Hinweis: Ich habe überprüft, dass das Präfix "good" vom Dienst akzeptiert wird, indem die xml-SOAP-Anforderung manuell über curl gesendet wird.
UPDATE
ich mit SUDS Quellcode und dem folgenden empirischen fix Kräften alle Elemente mit ref=
Attribute einmischte die Referee-ed-Namespace zu übernehmen (zuvor, nehmen sie auf dem Schemastammnamespace oder was auch immer tns
ist) :
Datei: /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
Arbeiten mit meinem Service, aber ich bin nicht sicher, ob es andere Sache brechen würde s. Ich würde eine intelligentere Lösung bevorzugen, die SUDS Quellcode nicht ändert.
Danke,
Alex
Dies ist eindeutig ein Fehler in Ihrem Stapel; Was meinst du mit "automatisch"? Sind Sie beispielsweise bereit, mit einer anderen, gleichwertigen XSD zu arbeiten, die mit Ihren Werkzeugen zusammenarbeitet? Von dem, was Sie sagen, wenn Sie die Ref mit einem lokal definierten Element ersetzen würden, wird es funktionieren; Bei allen XSD-Problemen ist das generierte XML identisch. Wenn Sie darüber nachdenken, den Flug zu ändern, zum Beispiel mit einer Art XSLT über einen Proxy, wäre das ein anderer Ansatz. Ich könnte eine Lösung empfehlen, die Ihre XSD automatisch refaktorisiert, um Refs durch lokale Elemente zu ersetzen. –
Ich habe tatsächlich versucht, Definitionen zu verschieben und zu ändern, aber da ich kein Experte bin, konnte ich vielleicht nicht die richtige Syntax bestimmen, SUDS hat immer den falschen Namespace dort hingelegt. Ich möchte auch nicht mit diesen spielen, da sie von einem externen Anbieter zur Verfügung gestellt werden und Änderungen unterliegen. Siehe UPDATE für eine nicht optimale Lösung, die ich bisher gefunden habe. –