Python开发Webservice(SOAP)
来源:互联网 发布:android网络编程 编辑:程序博客网 时间:2024/05/17 05:53
库的选择
针对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进行开发了。
客户端调用WebService一般应用suds库。
代码
针对简单数据类型
当接口中参数类型都为简单类型时(Integer, Decimal, Float, String, ..),除增加rpc装饰器外,接口代码与一般的Python方法代码是一样的:
from spyne import Application, rpc, ServiceBasefrom spyne import Integer, Unicode, Array, ComplexModelfrom spyne.protocol.soap import Soap11from spyne.server.wsgi import WsgiApplicationfrom wsgiref.simple_server import make_serverclass SomeSampleServices(ServiceBase): @rpc(Unicode, Unicode _returns=Unicode) def make_project(self, name, version): passif __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 Clientclient = 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数据对象,再对其属性进行赋值:
from suds.client import Clientclient = 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 Clientclient = Client("http://%s:%s/?wsdl" % (ip, port))project = {}project["name"] = "Test"project["version"] = "1.0.0"client.service.make_project(project)
可以发现,第二种方式编写更为方便,且更易理解
针对数组类型
当参数为Array(数组)型的变量时,接口代码如下:
class Project(ComplexModel): name = Unicode version = Unicodeclass SomeSampleServices(ServiceBase): @rpc(Array(Project), _returns=Unicode) def make_prodect(self, project): pass
调用时,需要创建对应类型的Array对象,对象创建好后,就可以应用Python的list对象对其进行赋值了:
from suds.client import Clientclient = 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"
- Python开发Webservice(SOAP)
- WebService开发 使用Soap
- Webservice-SOAP(六)
- webservice(soap)
- WebService开发(一) 如何使用Soap头
- PHP利用SOAP进行webservice开发(客户端)
- webservice cxf -- 基于soap方式开发(一)
- 用python发布基于soap的webservice
- Python编写WebService SOAP之原型
- [Python]webservice 学习(4) -- Django+soap
- WebService(4):CXF Spring开发WebService,基于SOAP和REST方式
- WebService笔记(三):SOAP
- WebService笔记(三):SOAP
- 使用SOAP开发Java Webservice详解
- 使用SOAP开发WebService 服务--Axis解决方案
- C#开发XML WebService接口(SOAP)
- 利用SOAP扩展开发WebService(PHP)
- 使用CXF 开发SOAP webservice 服务端实例
- android 文字过多只想显示多行多余的文字用省略号代替和调整行间距的属性
- 解决UITableView设置了偏移量但是不偏移的问题
- radionbutton、checkbox、RatingBar自定义样式
- java读取配置文件
- tp upload
- Python开发Webservice(SOAP)
- for each循环
- eclipse插件教程之复制内容到剪贴板
- Android : assets与res/raw资源目录的区别
- android 协作项目的签名文件的问题,以后补充一下
- 抽象类和接口的区别以及使用场景(记)
- android queryIntentActivities如何寻找出某个intent是否可用
- IOS后台 返回 /Date(1445340103367)/ 时间,转换成 2015-10-20 19:21 这种格式
- 关于c++多态