哪个python soap客户端支持spyne二进制类型?

时间:2016-12-05 22:51:46

标签: soap client suds spyne zeep

我想调用一个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将直接包含已解码的数据。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

Zeep应该处理字节很好,我刚刚对spyne服务器进行了测试。

E.g。 service.client.echo_bytearray(b'\ x00 \ x01 \ x02 \ x03 \ x04')没有问题。你有更多的信息吗?

干杯,迈克尔(泽普的作者)