Spyne Pythonライブラリを使用したSOAPおよびRESTサービス

Spyne Libraryの紹介



この記事では、すばらしいSpyne Pythonライブラリについてお話したいと思います。 Spyneとの知り合いは、SOAPプロトコルを介して要求を送受信するWebサービスを作成するタスクを与えられた瞬間に始まりました。 ちょっとグーグルでSpyneに出会いました 。これはsoaplibライブラリーのフォークです。 そして、このライブラリに関するロシア語の情報が非常に少ないことに驚きました。



Spyneを使用すると、SOAP、JSON、YAMLで動作するWebサービスを記述でき、mod_wsgi Apacheを介して記述されたスクリプトを実行できます。 それでは、いくつかの例を見て、作業スクリプトを作成し、Apacheで動作するようにスクリプトを構成しましょう。



1. SOAPサービス



英語への翻訳者として役立つWebサービスを作成しましょう。 当社のWebサービスはリクエストを受け取り、Yandex-translatorに連絡し、翻訳を受け取り、この翻訳をクライアントに提供します。 XML形式の着信要求は受け入れられます。 答えはXML形式でも行われます。



最初のステップは、APIキーを取得して、Yandexが自分自身であることを伝えることです。 これを行うには、 こちらをご覧ください



ここで、開発に直接渡します。



必要なライブラリ「pytz」、「spyne」、および「yandex_translate」をインストールします。 ライブラリはpip​​を介して非常に簡単にインストールされます。



アプリケーションコードは次のとおりです。



from spyne import Application, rpc, ServiceBase, Unicode from lxml import etree from spyne.protocol.soap import Soap11 from spyne.protocol.json import JsonDocument from spyne.server.wsgi import WsgiApplication from yandex_translate import YandexTranslate class Soap(ServiceBase): @rpc(Unicode, _returns=Unicode) def Insoap(ctx, words): print(etree.tostring(ctx.in_document)) translate = YandexTranslate('trnsl.1.1.201somesymbols') tr = translate.translate(words, 'en') tr_answer = tr['text'][0] return tr_answer app = Application([Soap], tns='Translator', in_protocol=Soap11(validator='lxml'), out_protocol=Soap11() application = WsgiApplication(app) if __name__ == '__main__': from wsgiref.simple_server import make_server server = make_server('0.0.0.0', 8000, application) server.serve_forever()
      
      





コードを分析しましょう:



必要なライブラリをインポートした後、引数「ServiceBase」を使用して「Soap」クラスを作成しました。 デコレータ「@rpc(Unicode、_returns = Unicode)」は、着信引数(「Unicode」)および発信応答(「_returns = Unicode」)のタイプを定義します。 利用可能な引数タイプのリストは、 公式ドキュメントに記載されています。 。 次に、引数ctxおよびwordsを使用してInsoapメソッドが作成されますctx引数には、着信リクエストに関する多くの情報が含まれているため、非常に重要です。 「print(etree.tostring(ctx.in_document))」行には、ユーザーが送信した形式で着信xml-requestが表示されます。 いくつかの点で、これは重要かもしれません。



たとえば、Webサービスを作成するとき、着信xml-requestを引き出してデータベースに書き込む必要がありました。 しかし、このXML要求を引き出す方法は、Spyneの公式ドキュメントには記載されていません。 Burak Arslan(Spyneの著者)は、lxmlライブラリの方向を調べることを推奨しました。 その後だけ、答えを見つけて、このスクリプトで結果を確認しました。 次に、メソッドはYandexトランスレーターに接続し、Yandexトランスレーターから受け取った結果をクライアントに返します。



変数「app」は、Webサービスの設定を定義します。 「Application([Soap]」 -初期化されるクラス(複数の場合があります)を示します。パラメーター「in_protocol」および「out_protocol」は、着信および発信リクエストのタイプを決定します。 SOAP v1.1。



「application = WsgiApplication(app)」という行が定義されているため、スクリプトはwsgiを介して機能します。



重要! アプリケーションがmod_wsgiを使用してApacheで動作できるように、変数名は「application」である必要があります。 次のコード行は、ポート8000​​でWebサーバーを初期化して起動します。



スクリプトを実行すると、テストを開始できます。 これらの目的のために、 SoapUIを使用します 。 便利なのは、SOAPサーバーを使用するように開始して構成した後、SoapUIが自動的にxml要求を生成することです。 URLをセットアップします: localhost :8000?Wsdl (スクリプトがローカルマシンで実行されていると仮定)、およびxmlリクエストは次のようになります。



XMLリクエストボディ
<soapenv:Envelope xmlns:soapenv = " schemas.xmlsoap.org/soap/envelope " xmlns:tran = "Translator">

<soapenv:ヘッダー/>

<soapenv:本体>

<tran:Insoap>

<tran:words>アプリケーションのテスト</ tran:words>

</ tran:Insoap>

</ soapenv:Body>

</ soapenv:エンベロープ>


私たちのウェブサービスは次の答えを出しました:



サーバー応答
<soap11env:Envelope xmlns:soap11env = "schemas.xmlsoap.org/soap/envelope" xmlns:tns = "Translator">

<soap11env:本体>

<tns:InsoapResponse>

<tns:InsoapResult>アプリをテスト</ tns:InsoapResult>

</ tns:InsoapResponse>

</ soap11env:Body>

</ soap11env:エンベロープ>


簡単ですね。



2. RESTサービス



今、それらを変更したとします。 タスク、およびJSONを介して機能するWebサービスを作成する必要があります。 どうする Django Rest FrameworkFlaskなどの別のフレームワークでサービスを書き換えますか? または、より少ない労力でできますか? はい、できます! そしてそれは必要です!



Spyneライブラリが役立ちます。



アプリケーションで変更する必要があるのは、「app」変数を次の形式にすることだけです。



 app = Application([Soap], tns='Translator', in_protocol=JsonDocument(validator='soft'), out_protocol=JsonDocument())
      
      





Webサービスを開始し、テスト中です。



JSONリクエストは次のようになります。



JSONリクエストボディ
{"Insoap":{"words": "Webサービスのテスト。 JSONを使用する "}}



Webサーバーは次の応答を返しました。



Webサーバーの応答
「Webサービスをテストします。 JSONを使用»



3.生産の結論



Apacheを介してWebサービスを実行するには、サーバーにApacheおよびmod_wsgi Webサーバーをインストールして構成する必要があります。 これらの作業は、ドキュメントに基づいて簡単に実行できます。 さらに、スクリプトでは、次の行を削除する必要があります。



削除する行
 if __name__ == '__main__': from wsgiref.simple_server import make_server server = make_server('0.0.0.0', 8000, application) server.serve_forever()
      
      







やった! 弊社のWebサービスは、運用中にすぐに使用できます。



PSの追加機能に関するPS(およびそれらの多くがあります)は、 公式Webサイトで常に見つけることができます。



All Articles