我想调用一个spyne二进制类型作为参数的Web服务方法。 但是我找不到任何支持它的python soap客户端。
为了调试我的问题,我制作了一个应该打印文件的简单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应用程序。 我的问题是在客户端。 使用suds,获得的错误是非常困难的,并且根据论坛没有解决方案。
我尝试使用python 2.7和3.3在https://wiki.python.org/moin/WebServices#SOAP上描述的所有SOAP客户端。 在序列化spyne二进制对象时,它们在构建请求时都会失败。
我的最后一次尝试是用zeep。 我使用wsdl local url实例化zeep客户端。 对不起,wsdl不公开。
我用空的ByteArray调用此方法:
param = ByteArray()
client.service.print_file(param)
param = ByteArray()
client.service.print_file(param)
被捕获的例外是:
有没有人知道是否有zeep的解决方案?
也许使用专用的zeep插件?
还是有另一种解决方案吗? 也许在C / C ++中,编译为python包?
埃里克
=============================================== =============
==解决方案
由于我在这个问题上失去了很多时间,所以这是我的解决方案。
最后我还需要文件名,而不仅仅是文件数据。 类型spyne.model.binary.File本来是完美的,但它不能用于SOAP格式。
感谢与Burak的讨论,最终的解决方案是创建一个自定义的ComplexType,如:
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
在带有suds的客户端,直接用base64中编码的数据替换ByteArray字段:
class File(ComplexModel):
filename = Unicode
data = ByteArray
在服务器端,f.data将直接包含已解码的数据。
答案 0 :(得分:0)
完整答案在这里:http://lists.spyne.io/archives/people/2016-December/000187.html
为了完整;如果手动执行base64操作,则可以使用suds。见https://github.com/arskom/spyne/blob/be222c041837c9f7cd1e6e6e455e6704b5069837/spyne/test/interop/test_suds.py#L111
答案 1 :(得分:0)
Zeep应该处理字节很好,我刚刚对spyne服务器进行了测试。
E.g。 service.client.echo_bytearray(b'\ x00 \ x01 \ x02 \ x03 \ x04')没有问题。你有更多的信息吗?
干杯,迈克尔(泽普的作者)