I have a camera and I am trying to connect to it vis suds. I have tried to send raw xml and have found that the only thing stopping the xml suds from working is an incorrect Soap envelope namespace.
The envelope namespace is:
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
and I want to rewrite it to:
xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
In order to add a namespace in python I try this code:
message = Element('Element_name').addPrefix(p='SOAP-ENC', u='www.w3.org/ENC')
But when I add the SOAP-ENV
to the namespace it doesn't write as it is hardcoded into the suds bindings. Is there a way to overwrite this in suds?
Thanks for any help.
I got around it by manually overriding the suds.binding.envns
variable in the bindings
module:
from suds.bindings import binding
binding.envns=('SOAP-ENV', 'http://www.w3.org/2003/05/soap-envelope')
From here on, all goes well (with my service, that is)
I managed to get this working, the soap envelope is hard coded into bindings.py
that is stored in suds.egg
installed in your site-packages. I changed the SOAP envelope address to http://www.w3.org/2003/05/soap-envelope
. This was compatible with my camera. I was unable to find a command to overwrite this envelope in suds so I hard coded it in to the bindings.py.
Thanks for any help
Manually updating binding.py
definitely isn't the right way to go. You should be able to utilize the ImportDoctor
to override your default bindings. Have a look at the documentation for fixing broken schemas on the Suds website.
Also, what versions of Python and suds are you using?
from suds.client import Client
from suds.plugin import MessagePlugin
WSDL_url = "my_url?wsdl"
class MyPlugin(MessagePlugin):
def marshalled(self, context):
#print(str(context.envelope))
context.envelope.nsprefixes['SOAP-ENV']='myText'
client = Client(WSDL_url, plugins=[MyPlugin()])