python web-services:ZSIを使用してサーバーから障害を返す
-
22-07-2019 - |
質問
Webサービス用のpythonクライアントを作成することに興味があります。テスト目的のために、単純なスタブサーバーを用意することも非常に興味深いでしょう。 python 2.3とZSI 2.0を使用しています。
問題は、サーバーから例外を返すことができないことです。
wsdlでsoapフォールトに使用される型の例外を発生させると、TypeErrorが発生します。「例外は、EmptyStringException_Defではなく、クラス、インスタンス、または文字列(非推奨)でなければなりません」。これは、フォールトオブジェクトがExceptionのサブクラスではないことを意味しますが、この方法で生成されたコードを変更しても助けにはなりませんでした-そしてもちろん、生成されたコードを変更する必要はありません:)
応答の一部として障害オブジェクトを返す場合、それは無視されます。
ZSIのエラー処理に関するドキュメントが見つかりませんでした。ヒントはありますか?
これは、入力文字列が空の場合にsoapエラーを返す、spellBackwardsという1つのメソッドのみを持つ非常に単純なサービスのサーバーのサンプルコードです。
#!/usr/bin/env python
from ZSI.ServiceContainer import AsServer
from SpellBackwardsService_services_server import *
from SpellBackwardsService_services_types import *
class SpellBackwardsServiceImpl(SpellBackwardsService):
def soap_spellBackwards(self, ps):
response = SpellBackwardsService.soap_spellBackwards(self, ps)
input = self.request._in
if len(input) != 0:
response._out = input[::-1]
else:
e = ns0.EmptyStringException_Def("fault")
e._reason = "Empty input string"
# The following just produces an empty return message:
# response._fault = e
# The following causes TypeError
# raise e
return response
AsServer(port=8666, services=[SpellBackwardsServiceImpl(),])
解決
Chris Hoobsによる ZSIクックブックで回答を見つけました。 ZSIホームページの下部:
5.4例外
厄介な質問は、サーバーで障害を生成する方法です。 ZSI v2.0コードで 提供されていますが、これは不可能です。
この論文はプロジェクトのホームページからリンクされているため、これは正しいと思います。
このペーパーでは、ZSIディストリビューションのFault.pyファイルにパッチを当てるという回避策も提案しています。
回避策をテストしましたが、約束どおりに機能します。ライブラリをパッチすることは、テスト目的でのみサーバーを生成する必要があるため(つまり、パッチを当てたライブラリを配布する必要はありません)、私にとって受け入れられるソリューションです。
他のヒント
質問に答えられなかったことをおologiesびします。
しばらくの間、ZSIと戦いました。
現在SUDSを使用しています: https://fedorahosted.org/suds/wiki 、すべてがよりシンプルになりました。