spyne html编码,Python开发Webservice(SOAP)

库的选择

针对Python的WebService开发,开发者讨论最多的库是soaplib(官方地址:http://soaplib.github.io/soaplib/2_0/index.html),但从其官网可知,其最新版本“soaplib-2.0.0-beta2”从2011年3月发布后就再也不进行更新了。经过阅读soaplib的官方文档,可知其再也不维护后已经转向了一个新的项目:rpclib(官方地址:http://github.com/arskom/rpclib)进行后续开发,但在rpclib的readme中,介绍了rpclib已经改名为spyne,并将持续进行更新,so,那就选用spyne进行开发了。html

客户端调用WebService通常应用suds库。python

代码

针对简单数据类型

当接口中参数类型都为简单类型时(Integer,Decimal,Float,String, ..),除增长rpc装饰器外,接口代码与通常的Python方法代码是同样的:git

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())

客户端调用代码:github

from suds.client import Client

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

ret = client.service.make_project("Test", "1.0.0")

针对复杂数据类型

当接口中数据类型为Complex数据类型(类型中包含类型)时,须要以类的方式定义类型,且继承于:spyne.model.complex.ComplexModel数组

class Project(ComplexModel):

name = Unicode

version = Unicode

客户端调用时,suds库提供了两种方式,第一种方式是应用factory子命名空间的方式,即先建立一个Complex数据对象,再对其属性进行赋值:app

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字典的方式传入参数:spa

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)

能够发现,第二种方式编写更为方便,且更易理解code

针对数组类型

当参数为Array(数组)型的变量时,接口代码以下:server

class Project(ComplexModel):

name = Unicode

version = Unicode

class SomeSampleServices(ServiceBase):

@rpc(Array(Project), _returns=Unicode)

def make_prodect(self, project):

pass

调用时,须要建立对应类型的Array对象,对象建立好后,就能够应用Python的list对象对其进行赋值了:xml

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"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值