6

suds と Python で SOAP リクエストを行う必要があります

<soap:Body> 
    <registerOrder> 
        <order merchantOrderNumber="" description="" amount=""  currency=""  language=""  xmlns=""> 
             <returnUrl>http://mysafety.com</returnUrl> 
        </order> 
    </registerOrder> 
</soap:Body>

registerOrder に属性を追加するには?

4

4 に答える 4

8

MessagePlugin のより動的なバージョンは次のようになります。

from suds.sax.attribute import Attribute
from suds.plugin import MessagePlugin

class _AttributePlugin(MessagePlugin):
    """
    Suds plug-in extending the method call with arbitrary attributes.
    """
    def __init__(self, **kwargs):
        self.kwargs = kwargs

    def marshalled(self, context):
        method = context.envelope.getChild('Body')[0]
        for key, item in self.kwargs.iteritems():
            method.attributes.append(Attribute(key, item))

使用法:

client = Client(url)
# method 1
client.options.plugins = [_AttributePlugin(foo='bar')]
response = client.service.method1()
client.options.plugins = []
# method 2
response = client.service.method2()
于 2011-08-24T14:55:31.993 に答える
5

sudsドキュメントで MessagePlugin を検索します。マーシャリングされたオプションは、あなたが探しているものです。プラグインとしてクライアントに追加する必要があります。

self.client = Client(url, plugins=[MyPlugin()])

整列化されたメソッドで、context.envelope チャイルドを検索します。python の vars() 関数は、この場所で非常に役立ちます。私が思うに、それはあなたにとって次のようなものになるはずです:

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"))

私は先週これに座っていたので、時間を節約できるかもしれません:)

于 2011-04-20T13:03:25.070 に答える
1

__inject クライアント オプションを使用して、特定の 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})

また、積極的に維持されている suds のフォークであるsuds-jurko https://pypi.python.org/pypi/suds-jurko/0.6を使用することを好みます。

于 2014-10-30T09:32:12.373 に答える