Je dois faire une demande de savon avec SUDS et Python
<soap:Body> <registerOrder> <order merchantOrderNumber="" description="" amount="" currency="" language="" xmlns=""> <returnUrl>http://mysafety.com</returnUrl> </order> </registerOrder> </soap:Body>
4 Réponses :
dans Documentation SUDS Recherchez un messagePlugin. L'option Marshaled est ce que vous recherchez. Vous devez l'ajouter à votre client en tant que plug-in:
from suds.sax.attribute import Attribute from suds.plugin import MessagePlugin class MyPlugin(MessagePlugin): def marshalled(self, context): foo = context.envelope.getChild('Body').getChild('registerOrder')[0] foo.attributes.append(Attribute("foo", "bar"))
Une version plus dynamique du messagePlugin serait la suivante: utilisation: p>
Vous pouvez utiliser l'option __Injejject client pour injecter un XML particulier XML
raw_xml = """<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope> <SOAP-ENV:Body> ... </SOAP-ENV:Body> </SOAP-ENV:Envelope>""" print client.service.example(__inject={'msg':raw_xml})
J'ai réutilisé https://fedorahosted.org/suds/ticket/21 et avoir adapté le code pour utiliser l'idée. Changez STDS comme ci-dessous et utilisez
--- a/website/suds/bindings/binding.py +++ b/website/suds/bindings/binding.py @@ -24,6 +24,7 @@ from suds.sax import Namespace from suds.sax.parser import Parser from suds.sax.document import Document from suds.sax.element import Element +from suds.sax.attribute import Attribute from suds.sudsobject import Factory, Object from suds.mx import Content from suds.mx.literal import Literal as MxLiteral @@ -101,7 +102,7 @@ class Binding: """ raise Exception, 'not implemented' - def get_message(self, method, args, kwargs): + def get_message(self, method, args, kwargs, attributes=None): """ Get the soap message for the specified method, args and soapheaders. This is the entry point for creating the outbound soap message. @@ -115,11 +116,23 @@ class Binding: @rtype: L{Document} """ + if attributes: + pass + # moved to suds/bindings/document.py + + #print method + #for name, val in attributes.items(): + # method.attributes.append(Attribute(name, val)) + + content = self.headercontent(method) header = self.header(content) - content = self.bodycontent(method, args, kwargs) + content = self.bodycontent(method, args, kwargs, attributes=attributes) body = self.body(content) env = self.envelope(header, body) + #if attributes: + # print content + # 1/0 if self.options().prefixes: body.normalizePrefixes() env.promotePrefixes() @@ -535,4 +548,4 @@ class PartElement(SchemaElement): return self else: return self.__resolved - \ No newline at end of file + diff --git a/website/suds/bindings/document.py b/website/suds/bindings/document.py index edd9422..0c84753 100644 --- a/website/suds/bindings/document.py +++ b/website/suds/bindings/document.py @@ -38,7 +38,7 @@ class Document(Binding): (multiple message parts), must present a I{document} view for that method. """ - def bodycontent(self, method, args, kwargs): + def bodycontent(self, method, args, kwargs, attributes=None): # # The I{wrapped} vs I{bare} style is detected in 2 ways. # If there is 2+ parts in the message then it is I{bare}. @@ -54,6 +54,12 @@ class Document(Binding): else: root = [] n = 0 + + if attributes: + #print root.__class__ + for name, val in attributes.items(): + root.set(name, val) + for pd in self.param_defs(method): if n < len(args): value = args[n] diff --git a/website/suds/client.py b/website/suds/client.py index 8b4f258..f80e36a 100644 --- a/website/suds/client.py +++ b/website/suds/client.py @@ -592,7 +592,10 @@ class SoapClient: timer.start() result = None binding = self.method.binding.input - soapenv = binding.get_message(self.method, args, kwargs) + attributes = kwargs.get('attributes', None) + if attributes: + del kwargs['attributes'] + soapenv = binding.get_message(self.method, args, kwargs, attributes) timer.stop() metrics.log.debug( "message for '%s' created: %s", @@ -841,4 +844,4 @@ class RequestContext: @type error: A suds I{TransportError}. """ return self.client.failed(self.binding, error) - \ No newline at end of file +