私は引数としてspyneバイナリ型を持つWebサービスメソッドを呼び出す必要があります。 しかし、私はそれをサポートするPythonの石鹸クライアントを見つけることができません。あなたが見ることができるようにどのPython Soapクライアントがspyneバイナリタイプをサポートしていますか?
# @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バイナリタイプで試してみました:
私の問題をデバッグするには、私は、ファイルを印刷する必要があり、単純なWebサービスメソッドを作りました。 デバッグのために、私はUnicodeで試して、ファイルの内容をbase64で渡しました。この場合は問題ありません。 したがって、Webサービスは操作可能です。
サーバー側は、Djangoアプリケーションとspyneアプリケーションです。 私の問題はクライアント側です。 sudsでは、取得されたエラーは非常にわかりにくく、フォーラムに応じた解決策はありません。
https://wiki.python.org/moin/WebServices#SOAPに記載されているすべてのSOAPクライアントをPython 2.7と3.3で試してみました。 spineバイナリオブジェクトをシリアライズするときに、リクエストを作成するときにそれらはすべて失敗します。
私の最後の試みはジープです。 wsdlローカルURLを使用してzeepクライアントをインスタンス化します。 申し訳ありませんが、wsdlは公開されていません。
私は空のByteArrayでこのメソッドを呼び出します。
param = ByteArray()
client.service.print_file(param)
catched例外は次のとおりです。ZEEPと解決策があるかどう
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プラグインを使用していますか?
また、別の解決策がありますか?
おそらくC/C++では、Pythonパッケージとしてコンパイルされていますか?
エリック
========================================= ===================
==解決策
私はこの問題に多くの時間を浪費していたので、ここで私の解決策です。
最後に、ファイルデータだけでなくファイル名も必要でした。 spyne.model.binary.File型は完璧でしたが、SOAP形式にはシリアル化できません。 、泡でクライアント側では
class File(ComplexModel):
filename = Unicode
data = ByteArray
BASE64でエンコードされたデータを直接ByteArrayのフィールドを置き換えます:ブラクとの議論に
感謝は、最終的な解決策のようなカスタムのComplexTypeを作成することです
f = File()
data = open({FILENAME}, "rb").read()
f.data = base64.b64encode(data)
サーバー側では、f.dataにはデコードされたデータが直接含まれます。
ありがとうございました。私はByteArray型をバイパスしてb64encodeの結果で置き換えようとしていませんでした。 –
ByteArrayは値ではなく、単なる型マーカーです。 ByteArrayと互換性のあるネイティブな値は一連のバイトです。例えば。バイナリデータをクラスに正しく割り当てるには 'A(a = [b" \ x00 \ x01 etc .. "])'を実行する必要があります。 –