在Robot框架中使用SUDS库和MessagePlugin创建对象类型的Soap消息
这是这个问题的延续: 在那里,确定使用RF肥皂水不可能单独使用肥皂水创建具有ObjectType的消息。我想尝试MessagePlugin方法,但遗憾的是文档中的信息对我来说还不够:在Robot框架中使用SUDS库和MessagePlugin创建对象类型的Soap消息,soap,robotframework,suds,Soap,Robotframework,Suds,这是这个问题的延续: 在那里,确定使用RF肥皂水不可能单独使用肥皂水创建具有ObjectType的消息。我想尝试MessagePlugin方法,但遗憾的是文档中的信息对我来说还不够: from robot.libraries.BuiltIn import BuiltIn from suds.plugin import MessagePlugin class _MyPlugin(MessagePlugin): def marshalled(self, context):
from robot.libraries.BuiltIn import BuiltIn
from suds.plugin import MessagePlugin
class _MyPlugin(MessagePlugin):
def marshalled(self, context):
body = context.envelope.getChild('Body')
foo = body[0]
foo.set('id', '12345')
foo.set('version', '2.0')
class SudsLibraryExtensions(object):
def attach_my_plugin(self):
client = BuiltIn().get_library_instance("SudsLibrary")._client()
# prepend so SudsLibrary's plugin is left in place
plugins = client.options.plugins
if any(isinstance(x, _MyPlugin) for x in plugins):
return
plugins.insert(0, _MyPlugin())
client.set_options(plugins=plugins)
有没有人有关于如何使用上述代码段的完整机器人示例?我应该将什么作为上下文传递到编组中?我是否需要在某个时候调用attach_my_plugin()?中可以找到消息插件的一般说明。更多细节请参阅。你不需要调用marshaled,suds需要调用。为了更好地理解如何实现封送方法,请阅读的文档。suds插件本质上是一个监听器。我的示例使用公共web服务进行演示 假设您的请求如下所示:
...
<ns0:Body>
<ns1:GetStatistics>
<ns1:X>
...
....
<ns0:Body>
<ns1:GetStatistics type="specialType">
<ns1:X>
...
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
只要插件附加了关键字Attach My plugin,type属性就会一直被设置。有一个默认类型。要更改type的值,请使用关键字Set GetStats type。任何类型集都将在以后的所有请求中使用,直到它被更改为止。这里使用两个类的唯一原因是防止“封送”成为公开关键字
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