2016-07-11 10 views
0

Ich versuche, einen kleinen SOAP 1.1-Server mit twisted und Spyne einzurichten, aber ich kann anscheinend nichts finden, wie benutzerdefinierte Tags (Body), Namespaces oder Header für meine Antworten zu erstellen. Gibt es einen besseren Weg dies zu tun, als eine eigene ProtocolBase zu erstellen?Benutzerdefinierte Tags mit Spyne

Das Ziel ist, Seife Antworten zu haben, die wie folgt aussehen:

<?xml version="1.0"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cwmp="urn:dslforum-org:cwmp-1-2"> 
<SOAP-ENV:Header> 
    <cwmp:ID SOAP-ENV:mustUnderstand="1">123456789</cwmp:ID> 
</SOAP-ENV:Header> 
<SOAP-ENV:Body> 
    <cwmp:SetParameterValues> 
     <ParameterList SOAP-ENC:arrayType="cwmp:ParameterValueStruct[1]"> 
      <ParameterValueStruct> 
       <Name>MY.NAME</Name> 
       <Value xsi:type="xsd:unsignedInt">4000</Value> 
      </ParameterValueStruct> 
     </ParameterList> 
     <ParameterKey>Axess Update parameters</ParameterKey> 
    </cwmp:SetParameterValues> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Im fähig, zu produzieren, was ich suche mein eigenes Protokoll zu schaffen, für die ich eine Reihe von XML ähnlich wie unter der Hand.

class spyne(ServiceBase): 
    isLeaf = TwistedWebResource 

    @rpc(AnyDict, AnyDict, _returns=Unicode) 
    def my_rpc(ctx, DeviceId, ParameterList): 

     out_document = etree.parse('data.xml') 

     return etree.tostring(out_document, pretty_print=True, 
             encoding='utf8', xml_declaration=False) 

class my_protocol(XmlDocument): 

    mime_type = 'text/xml; charset=utf-8' 
    type = set(XmlDocument.type) 
    type.update(('soap', 'soap11')) 

    def __init__(self, *args, **kwargs): 
     super(TR_069_SOAP, self).__init__(*args, **kwargs) 

    def serialize(self, ctx, message): 
     ctx.out_document = ctx.out_object[0] 

    def create_out_string(self, ctx, charset=None): 
     ctx.out_string = [ctx.out_document] 

Ich bin mir nicht sicher, ob es einen besseren Weg gibt, dies zu tun.

+0

Welches Dokument müssen Sie erstellen? Hast du ein Beispiel? Was hast du versucht? Irgendwelchen Code kannst du mir zeigen? –

+0

@BurakArslan Ich aktualisierte meine Frage mit einigen zusätzlichen Informationen. Jede Hilfe wäre willkommen. –

Antwort

0

Spyne unterstützt keine Serialisierung von Arrays mit dem SOAP-ENC:arrayType="cwmp:ParameterValueStruct[1]"-Stil, was auch immer das bedeutet.

Sie nicht über Ihr eigenes Protokoll benötigen, aber Sie brauchen XmlDocument ‚s complex_to_parent in Soap11 und fügen Sie eine spezielle Behandlung für Arrays außer Kraft zu setzen, die, sagen wir, Array (Sometype, array_type = "CWMP: ParameterValueStruct [1]") haben .

Sie können Spyne entweder selbst patchen und eine Pull-Anfrage senden oder eine Soap11 eigene Unterklasse erstellen (NOT XmlDocument) und dort den Code schreiben.

Chime in http://lists.spyne.io/listinfo/people, wenn Sie in beide Richtungen fortfahren möchten.

Verwandte Themen