2010-03-18 5 views
13

Ich habe eine Kamera in meinem Netzwerk, mit der ich versuche, eine Verbindung mit Seifenlauge aber Schaum nicht alle erforderlichen Informationen zu senden. Ich muss zusätzliche Soap-Header setzen, die nicht in der WSDL-Datei definiert sind, damit die Kamera die Nachricht verstehen kann. Alle Header sind in einem SOAP-Envelope enthalten und dann sollte der Befehl suds im Hauptteil der Nachricht sein.So übergeben SOAP-Header in Python SUDS, die nicht in WSDL-Datei definiert sind

Ich habe den Schaum website geprüft und es sagt, wie dies in dem Header zu übergeben: (Dies passiert in dem Elemente als Header, aber ich habe einen Umschlag so bin ich nicht sicher, wie dies zu Eingang)

from suds.sax.element import Element 
client = client(url) 
ssnns = ('ssn', 'http://namespaces/sessionid') 
ssn = Element('SessionID', ns=ssnns).setText('123') 
client.set_options(soapheaders=ssn) 
result = client.service.addPerson(person) 

Jetzt bin ich mir nicht sicher, wie ich das umsetzen würde. Sagen Sie zum Beispiel, ich habe die folgenden Header:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP 
ENC="http://www.w3.org/2003/05/soap-encoding" 
<wsa:MessageID SOAP-ENV:mustUnderstand="true">urn:uuid:43268c01-f09c6</wsa:MessageID> 
<SOAP-ENV:Header> 

Unter Verwendung dieses oder ein ähnliches Beispiel weiß jemand wie ich eine gültige SOAP-Nachricht an den Zieldienst passieren würde?

Dank

Antwort

20

Ich habe gearbeitet, wie in neuen Header und Namespaces in Schaum gelangen. Wie oben angegeben Sie ein Element erstellen und es in als SOAPHeader- passieren, wie so:

from suds.sax.element import Element 
client = client(url) 
ssnns = ('ssn', 'http://namespaces/sessionid') 
ssn = Element('SessionID', ns=ssnns).setText('123') 
client.set_options(soapheaders=ssn) 
result = client.service.addPerson(person) 

Aber wenn Sie einen Namespace hinzufügen möchte ich ein Präfix hinzufügen scheinen die gefunden haben, den Trick zu tun. Wenn Sie also eines der Elemente erstellen, fügen Sie addPrefix hinzu. Ich bin mir nicht sicher, ob das so war, wie es geplant war, aber es funktioniert.

ssn = Element('SessionID', ns=ssnns).setText('123').addPrefix(p='SOAP-ENC', u='http://www.w3.org/2003/05/soap-encoding') 

kann die p = 'SOAP-ENC' jeder Präfix sein eg. wsa und die u = http://address ist die Adresse des Namensraums.

Ein vollständiges Skript, das sein könnte laufen würde:

#!/usr/local/bin/python2.6 

import suds 
#import logging 
from suds.client import Client 
from suds.sax.element import Element 
from suds.sax.attribute import Attribute 
from suds.xsd.sxbasic import Import 

def absoluteMove(): 

    # connects to WSDL file and stores location in variable 'client' 
    client = Client('http://10.10.10.10/p.wsdl') 
    client.options.location = 'http://10.10.10.10:32963' 

    # Create the header 
    wsans = ('wsa', 'http://schemas.xmlsoap.org/ws/2004/08/addressing') 
    mustAttribute = Attribute('SOAP-ENV:mustUnderstand', 'true') 
    n1s = ('SOAP-ENC', 'http://www.w3.org/2003/05/soap-encoding') 
    msgId = Element('Element').addPrefix(p='SOAP-ENC', u='http://www.w3.org/2003/05/soap-encoding') 

    msgId2 = Element('Address', ns=wsans).setText('http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous') 
    msgId1 = Element('ReplyTo', ns=wsans).insert(msgId2) 
    msgId1.append(mustAttribute) 

    msgId3 = Element('To', ns=wsans).setText('http://10.10.10.10:32954') 
    msgId3.append(mustAttribute) 

    client.set_options(soapheaders=[msgId, msgId1, msgId3, msgId2]) 

    # Create 'token' object to pass as an argument using the 'factory' namespace 
    token = client.factory.create('ns4:ReferenceToken') 

    # Create 'dest' object to pass as an argument and values passed to this object 
    dest = client.factory.create('ns4:PTZVector') 
    dest.PanTilt._x=1 
    dest.PanTilt._y=4.9 
    dest.Zoom._x=1 


    # Create 'speed' object to pass as an argument and values passed to this object 
    speed = client.factory.create('ns4:PTZSpeed') 
    speed.PanTilt._x=0 
    speed.PanTilt._y=0 
    speed.Zoom._x=1 

    # 'AbsoluteMove' method invoked passing in the new values entered in the above objects 

    try: 
     result = client.service.AbsoluteMove(token, dest, speed) 
     print "absoluteMove result ", result 
     return result 
    except suds.WebFault, e: 
     print "suds.WebFaults caught: " 
     print e 

if __name__ == '__main__': result = absoluteMove() 

Dies bewegt die Kamera. Um den Typ des Seifenumschlags zu ändern, überprüfen Sie my next question.

Sie können die Protokollierung in diesem Skript hinzufügen whci das können Sie überprüfen, welche XML-Befehl Sie gesendet haben, das ist praktisch:

import logging 
logging.basicConfig(level=logging.INFO) 
logging.getLogger('suds.client').setLevel(logging.DEBUG) 

Die Lage kann als Option in das Skript gesetzt werden, wenn die Lage ist nicht in Die WSDL-Datei.