Eine allgemeine Beschreibung der Nachrichten-Plugins finden Sie in der Suds documentation. Weitere Details finden Sie in der class documentation. Sie rufen Marshall nicht auf, Schaum. Um besser zu verstehen, wie die Marshalled-Methode implementiert wird, lesen Sie die Dokumentation für Element. Ein Suds-Plugin ist im Wesentlichen ein Listener. In meinem Beispiel wird ein öffentlicher Webdienst zur Demonstration verwendet.
Sagen Sie Ihre Anfrage wie folgt aussieht:
...
<ns0:Body>
<ns1:GetStatistics>
<ns1:X>
...
Aber man muss es so aussehen:
....
<ns0:Body>
<ns1:GetStatistics type="specialType">
<ns1:X>
...
hier ein Plugin ist, dass das type-Attribut auf das GetStatistics Element hinzufügt. Dies kann erforderlich sein, wenn ein Element über untergeordnete Elemente und Attribute verfügt. Suds 0.4 unterstützt dies nicht, aber es ist eine gültige SOAP. Es kann eine Abzweigung von Suds geben, die dies unterstützt.
*** Settings ***
Library SudsLibrary
Library c:/SudsLibraryExtensions.py
*** Test Cases ***
Message Plugin
Create Soap Client http://www.webservicex.net/Statistics.asmx?WSDL
Attach My Plugin
Set GetStats Type specialType
${dbl array}= Create Wsdl Object ArrayOfDouble
Append To List ${dbl array.double} 2.0
Append To List ${dbl array.double} 3.0
${result}= Call Soap Method GetStatistics ${dbl array}
Should Be Equal As Numbers ${result.Average} 2.5
Inhalt von C: /SudsLibraryExtensions.py:
from robot.libraries.BuiltIn import BuiltIn
from suds.plugin import MessagePlugin
class _MyPlugin(MessagePlugin):
def __init__(self):
self._type = 'defaultType'
def marshalled(self, context):
body = context.envelope.getChild('Body')
call = body.getChild('GetStatistics')
call.set('type', self._type)
def set_getstats_type(self, value):
self._type = value
class SudsLibraryExtensions(object):
def attach_my_plugin(self):
client = BuiltIn().get_library_instance("SudsLibrary")._client()
plugins = client.options.plugins
if any(isinstance(x, _MyPlugin) for x in plugins):
return
# prepend so SudsLibrary's plugin is left in place
plugins.insert(0, _MyPlugin())
client.set_options(plugins=plugins)
def set_getstats_type(self, value):
self._get_plugin().set_getstats_type(value)
def _get_plugin(self):
client = BuiltIn().get_library_instance("SudsLibrary")._client()
plugins = client.options.plugins
my_plugin = next((plugin for plugin in plugins if isinstance(plugin, _MyPlugin)), None)
if my_plugin is None:
raise RuntimeError("Plugin not found. Did you call Attach My Plugin?")
return my_plugin
Das type-Attribut wird immer so lange eingestellt werden, wie das Plugin Mein Plugin mit dem Schlüsselwort anhängen angebracht ist. Es gibt einen Standardtyp. Um den Wert von type zu ändern, wird das Schlüsselwort Set GetStats Type verwendet. Jeder Typsatz wird in allen zukünftigen Anforderungen verwendet, bis er geändert wird. Der einzige Grund, warum hier zwei Klassen verwendet werden, besteht darin, zu verhindern, dass "marshalled" zu einem exponierten Schlüsselwort wird.