我想调用一个spyne二进制类型作为参数的Web服务方法。 但我无法找到任何支持它的python soap客户端。哪个python soap客户端支持spyne二进制类型?
调试我的问题,我做了应该打印一个文件一个简单的Web服务方法:
# @srpc(Attachment, _returns=Unicode)
@srpc(ByteArray, _returns=Unicode)
# @srpc(File, _returns=Unicode)
# @srpc(Unicode, _returns=Unicode)
def print_file(file_content):
logger.info(u"print file:\n{}\ntype:{}".format(file_content, file_content.__class__))
return u''
正如你所看到的,我试着用3种spyne二进制类型。 对于调试,我也尝试过使用Unicode,并将文件内容传递给base64,在这种情况下没有问题。 因此,Web服务是可操作的。
服务器端是一个Django应用程序和spyne应用程序。 我的问题是在客户端。 泡沫,获得的错误是非常模糊的,并没有解决方案存在根据论坛。
我尝试了所有在https://wiki.python.org/moin/WebServices#SOAP上描述的SOAP客户端,使用python 2.7和3.3。 当序列化spyne二进制对象时,它们在构建请求时都失败。
我最后的尝试是与zeep。 我用wsdl本地url实例化zeep客户端。 对不起,wsdl不公开。
我把这种方法用一个空的ByteArray:
param = ByteArray()
client.service.print_file(param)
的擦肩而过的例外是:
File "/usr/lib/python2.7/site-packages/zeep/client.py", line 41, in __call__
self._op_name, args, kwargs)
File "/usr/lib/python2.7/site-packages/zeep/wsdl/bindings/soap.py", line 107, in send
options=options)
File "/usr/lib/python2.7/site-packages/zeep/wsdl/bindings/soap.py", line 65, in _create
serialized = operation_obj.create(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/zeep/wsdl/definitions.py", line 165, in create
return self.input.serialize(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/zeep/wsdl/messages/soap.py", line 48, in serialize
self.body.render(body, body_value)
File "/usr/lib/python2.7/site-packages/zeep/xsd/elements.py", line 333, in render
self._render_value_item(parent, value)
File "/usr/lib/python2.7/site-packages/zeep/xsd/elements.py", line 354, in _render_value_item
return self.type.render(node, value)
File "/usr/lib/python2.7/site-packages/zeep/xsd/types.py", line 356, in render
element.render(parent, element_value)
File "/usr/lib/python2.7/site-packages/zeep/xsd/indicators.py", line 189, in render
element.render(parent, element_value)
File "/usr/lib/python2.7/site-packages/zeep/xsd/elements.py", line 333, in render
self._render_value_item(parent, value)
File "/usr/lib/python2.7/site-packages/zeep/xsd/elements.py", line 354, in _render_value_item
return self.type.render(node, value)
File "/usr/lib/python2.7/site-packages/zeep/xsd/types.py", line 180, in render
parent.text = self.xmlvalue(value)
File "/usr/lib/python2.7/site-packages/zeep/xsd/builtins.py", line 83, in _wrapper
return func(self, value)
File "/usr/lib/python2.7/site-packages/zeep/xsd/builtins.py", line 357, in xmlvalue
return base64.b64encode(value)
File "/usr/lib64/python2.7/base64.py", line 53, in b64encode
encoded = binascii.b2a_base64(s)[:-1]
TypeError: must be convertible to a buffer, not ModelBaseMeta
有谁知道是否有与ZEEP的解决方案?
也许有专用的zeep插件?
或者还有其他解决方案吗?
也许在C/C++中,编译为python包?
埃里克
========================================= ===================
==解决方案
由于我在这个问题上浪费了很多时间,下面是我的解决方案。
最后我还需要文件名,不仅是文件数据。 spyne.model.binary.File类型应该是完美的,但它不能被串行化为SOAP格式。
感谢与布拉克讨论,最终的解决方案是创建一个定制的ComplexType像:
class File(ComplexModel):
filename = Unicode
data = ByteArray
在具有泡沫客户端,直接与base64编码的数据替换的ByteArray字段:
f = File()
data = open({FILENAME}, "rb").read()
f.data = base64.b64encode(data)
在服务器端,f.data将直接包含解码的数据。