python发布及调用基于SOAP的webservice
现如今面向服务(SOA)的架构设计已经成为主流,把公用的服务打包成一个个webservice供各方调用是一种非常常用的做法,而应用最广泛的则是基于SOAP协议和wsdl的webservice。本文讲解python环境下如何发布及调用一个基于SOAP的webservice,基于soaplib(发布)和suds(调用)。
OS:ubuntu 14.04 python:2.7.6
服务端:
1.安装:
服务端要使用的工具包是soaplib,遗憾的是现在也停止维护了,不过好在还能用,下载地址在https://github.com/soaplib/soaplib,其官方文档在http://soaplib.github.io/soaplib/2_0/
首先直接下载zip文件,解压后直接运行python setup.py install即可。
2.写一个webservice服务:
接下来举个栗子,下面是一个接受一个string类型入参并返回一个string类型出参的webservice
import soaplib
from soaplib.core.model.primitive import String
from soaplib.core.server import wsgi
from soaplib.core.service import DefinitionBase #所有的服务类都继承DefinitionBase基类
from soaplib.core.service import soap #soap标识方法的特性 from model import feedforward class webserver(DefinitionBase):
@soap(String, _returns=String)
def GetModel(self, input):
return 'hello world' if __name__ == '__main__':
try:
from wsgiref.simple_server import make_server
soap_application = soaplib.core.Application([webserver], 'tns', 'webservice')
wsgi_application = wsgi.Application(soap_application) print "listening to http://0.0.0.0:7789"
print "wsdl is at: http://172.11.0.11:7789/?wsdl" server = make_server('172.11.0.11', 7789, wsgi_application)
server.serve_forever() except ImportError:
print "Error: example server code requires Python >= 2.5"
注意第11行的soap注解
@soap(String, _returns=String)
表示这个被注解的方法GetModel需要接受一个String类型的入参,_returns=String表示该方法返回的出参也是String类型。当然也可以设置更复杂的参数类型或是自定义类型,例如:
@soap(User, _returns=String)
def GetUser(self, user):
name = user.Name
return name
表示入参是一个自定义的类型User,出参为String,但是自定义的类型一定要继承ClassModel类:
class User(ClassModel):
__namespace__ = "User"
Name=String
如果返回的类型是集合需要用soaplib的Array类型,例如:
@soap(_returns=Array(String))
def GetCdrArray(self):
L_Result=["","",""] #返回集合数据的格式
return L_Result
3.发布webservice
上例中从第15行if __name__ == '__main__'开始的就是webservice的发布过程。首先要创建一个Application对象:
soap_application = soaplib.core.Application([webserver], 'tns', 'webservice')
按照文档,其中第一个参数表示 An iterable of ServiceBase subclasses that define the exposed services. 即把所有想要发布的服务所在的类装入一个列表作为该方法的第一个参数
第二个参数表示 The targetNamespace attribute of the exposed service 即该webservice的命名空间,默认为tns
第三个参数表示 The name attribute of the exposed service 默认为None
接下来将soap_application转化为一个wsgi_application: wsgi_application = wsgi.Application(soap_application)
最后新建一个server对象,设定IP和端口,接着启动即可:
server = make_server('172.11.0.11', 7789, wsgi_application)
server.serve_forever()
这样就发布了一个webservice,然后在浏览器里输入http://172.11.0.11:7789/?wsdl就能看到相应的wsdl文件了
客户端:
客户端我们使用suds调用webservice
1.安装
首先还是安装,官方主页https://fedorahosted.org/suds/,下载自己想要的版本,然后解压,python setup.py install 即可,与安装soaplib完全一致。文档地址在https://fedorahosted.org/suds/wiki/Documentation
2.使用
使用suds调用webservice非常简单。
import suds
import logging
logging.basicConfig(level=logging.INFO) class webservice_client(): def __init__(self, url):
self.client = suds.client.Client(url) # 通过smile获取model
def get_model(self, input):
try:
model = self.client.service.GetModel(input)
return model
except Exception,e:
logging.info('获取model失败:'+str(e))
return None if __name__ == '__main__':
test = webservice_client('http://172.11.30.211:7789/?wsdl')
print test.get_model('')
运行这个脚本,可以得到返回值hello world。
以上即python 发布及调用一个基于soap协议的wsdl类型webservice的方法
python发布及调用基于SOAP的webservice的更多相关文章
- 使用sproxy.exe访问基于soap的webservice
使用vc访问基于soap的webservice有多种方法,其中有一种是使用atlsoap,关于这个可以搜索sproxy.exe文章,不在这介绍(主要是我的写作能力太差).我写这个日记主要是项记录访问w ...
- PHP基于SOAP实现webservice
简单对象访问协议(SOAP)是一种轻量的.简单的.基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息. SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( H ...
- Android调用基于.net的WebService
在实际开发项目中,有时候会为Android开发团队提供一些接口,一般是以asmx文件的方式来承载.而公布出去的数据一般上都是标准的json数据.但是在实际过程中,发现Android团队那边并不是通过将 ...
- C# WebService创建、发布、调用的简单例子
Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...
- 使用CXF实现基于Soap协议的WebService
本文介绍使用CXF实现基于Soap协议的WebService(CXF的版本是3.0.0) 一. 前言 Java有三种WebService规范:Jax-WS,Jax-RS,Jaxm 1. Jax-WS( ...
- 第二篇:利用shell脚本执行webservice请求——基于soap
1. 项目背景 以往我们在开发基于webservice的项目中,我们总习惯于直接使用webservice的一些框架,如Axis,axis2和Xfire等.框架的好处是将webservice所涉及到的s ...
- 使用CXF发布和调用webservice之HelloWorld入门
依赖的JAR cxf-2.2.10.jar jetty-6.1.21.jar jetty-util-6.1.21.jar servlet-2_5-api.jar ...
- 使用axis2进行webservice发布与调用
一.介绍下cxf.axis.axis2区别 新一代的Web Services 框架如Axis2.CXF 都是由现有的项目中逐渐演化而来的,Axis2 是由大家熟悉的Axis 1.x 系列演化过来,而A ...
- Android与服务器端数据交互(基于SOAP协议整合android+webservice)
http://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html 上一节中我们通过http协议,采用HttpClient向服务器端a ...
随机推荐
- 8.javaweb之session
session是客户端和服务端的一次会话 web的session是指用户在浏览某个网站时,从进入网站到关闭浏览器的这段时间,uyejiushi用户浏览这个网站所花费的时间. session是一个时间的 ...
- 关于XML(可扩展标记语言)的基础知识与写法
XML(Extensible Markup Language) HTML:超文本标记语言,主要用来展示 XML:可扩展标记语言,用来做数据传输XML特点:1.树状结构,有且只有一个根2.标签名自定 ...
- touchmover手机移动端的拖动
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <meta name= ...
- Bootstrap table使用心得---thead与td无法对齐的问题
当使用工具条中的显示/隐藏列的时候, 经常出现表格的列头与内容无法对齐的问题. 1. 去掉option中的height,完美对齐,但当数据较多的时候,table会自动增加height,显示所有数据而不 ...
- 阿里云服务器 通过JavaMail发送邮箱STMP问题( 25端口被禁用 使用SSL协议465端口 )
我们传统使用的比较简单的是 STMP 25端口收发邮件 今天发现刚购买的阿里云服务器不能作为客户端通过STMP 25端口发送邮件 开始在网上有说发现是JDK1.8的原因,然后自己也把JDK1.8换到了 ...
- Java编程代码性能优化总结
如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的. 代码优化的目标是: 1.减小代码的体积 2.提高代码运行的效率 ...
- DotNetCore跨平台~服务总线_事件总线的重新设计
理论闲话 之前在.netFramework平台用的好好的,可升级到.net core平台之后,由于不再需要二进制序列化,导致咱们的事件机制遇到了问题,之前大叔的事件一直是将处理程序序列化后进行存储的, ...
- mysql sql 基础总结
1 mysql top n使用 select * from table limit n; 2 统配符使用必须和like结合使用 like % 通配符 描述 % 替代一个或多个字符 _ 仅替代一个 ...
- linux中grep命令的用法
作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的. 首先谈一下grep命令的常用格式为:[grep [选项] "模式" [ ...
- iOS是最安全的?苹果iOS恶意软件数量增速首次超过Android
之前小编还说Android系统似乎已经成为世界各地病毒作者的首选目标,但是近日一份安全研究报告让小编啪啪打脸. Skycure的移动安全报告显示,近三个季度内,在iOS上运行的恶意软件增加了2倍多,而 ...