Python開発Webservice(SOAP)

3283 ワード

ライブラリの選択
PythonのWebServiceの開発について、開発者が最も議論しているライブラリはsoapplibです.http://soaplib.github.io/soaplib/2_0/index.html)が、公式サイトによると、最新バージョンの「soapplib-2.0-beta 2」は2011年3月にリリースされてから更新されなくなりました.sopclibの公式文書を読むことによって、もうメンテナンスしなくなりました.もう新しいプロジェクトに転向しました.rpclib(公式アドレス:http://github.com/arskom/rpclib)後続の開発を行っていますが、rpclibのreadmeでは、rpclibが既にspyneに変更されていることを紹介し、継続的に更新します.そして、spyneを選んで開発しました.
クライアントがWebServiceを呼び出します.
コード
単純データタイプに対して
インターフェースのパラメータタイプがすべてシンプルなタイプの場合(Integer、 Decimal Float String.)は、rpc装飾器を追加する以外に、インターフェースコードは一般的なPython方法コードと同じです.
from spyne import Application, rpc, ServiceBase
from spyne import Integer, Unicode, Array, ComplexModel
from spyne.protocol.soap import Soap11
from spyne.server.wsgi import WsgiApplication
from wsgiref.simple_server import make_server

class SomeSampleServices(ServiceBase):

    @rpc(Unicode, Unicode _returns=Unicode)
    def make_project(self, name, version):
        pass

if __name__ == "__main__":
    soap_app = Application([SomeSampleServices],
                           'SampleServices',
                           in_protocol=Soap11(validator="lxml"),
                           out_protocol=Soap11())
    wsgi_app = WsgiApplication(soap_app)
    server = make_server(ip, port, wsgi_app)

    sys.exit(server.serve_forever())
クライアントコールコード:
from suds.client import Client

client = Client("http://%s:%s/?wsdl" % (ip, port))

ret = client.service.make_project("Test", "1.0.0")
複雑なデータタイプに対して
インターフェースのデータタイプがComplexデータタイプ(タイプにはタイプが含まれています)の場合、クラスでタイプを定義する必要があります.
class Project(ComplexModel):
    name = Unicode
    version = Unicode
クライアント呼び出し時に、sudsライブラリはfactory子の名前空間を適用する方式として、最初にCompplexデータオブジェクトを作成して、その属性を付与する方法の2つを提供しています.
from suds.client import Client

client = Client("http://%s:%s/?wsdl" % (ip, port))

project = client.factory.create("Project")
project.name = "Test"
project.version = "1.0.0"

client.service.make_project(project)
別の方法は、Python辞書を直接適用する方法でパラメータを入力することである.
from suds.client import Client

client = Client("http://%s:%s/?wsdl" % (ip, port))

project = {}
project["name"] = "Test"
project["version"] = "1.0.0"

client.service.make_project(project)
第二の方式の方がより便利で分かりやすいということが分かります.
配列の種類
パラメータがAray(配列)型の変数の場合、インターフェースコードは以下の通りです.
class Project(ComplexModel):
    name = Unicode
    version = Unicode


class SomeSampleServices(ServiceBase):

    @rpc(Array(Project), _returns=Unicode)
    def make_prodect(self, project):
        pass
呼び出し時には、対応する種類のArayオブジェクトを作成する必要があります.オブジェクト作成後、Pythonのlistオブジェクトを適用して、値を付けられます.
from suds.client import Client

client = Client("http://%s:%s/?wsdl" % (ip, port))

projects = client.factory.create("ProjectArray")
projects.project = [project1, project2] 

client.service.make_project(projects)
 
添付:
spyne_docs = "http://spyne.io/docs/2.10/"
suds_docs = "https://fedorahosted.org/suds/wiki/Documentation"