2016-12-05 19 views
1

私は引数として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にはデコードされたデータが直接含まれます。

答えて

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

+0

ありがとうございました。私はByteArray型をバイパスしてb64encodeの結果で置き換えようとしていませんでした。 –

+0

ByteArrayは値ではなく、単なる型マーカーです。 ByteArrayと互換性のあるネイティブな値は一連のバイトです。例えば。バイナリデータをクラスに正しく割り当てるには 'A(a = [b" \ x00 \ x01 etc .. "])'を実行する必要があります。 –

0

Zeepはバイトをうまく処理する必要があります。スピンサーバーに対してこれをテストしました。

など。 service.client.echo_bytearray(b '\ x00 \ x01 \ x02 \ x03 \ x04')は問題なく動作します。もっと情報がありますか?

乾杯、マイケル(著者のジープ)

+0

マイケルに感謝します。 Burakとして、ByteArrayオブジェクトではなく、バイトでWebサービスを直接呼び出します。 ByteArrayオブジェクトを渡そうとすると、動作しません。それは私の間違いでした。 –

関連する問題