现如今面向服务(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的更多相关文章

  1. 使用sproxy.exe访问基于soap的webservice

    使用vc访问基于soap的webservice有多种方法,其中有一种是使用atlsoap,关于这个可以搜索sproxy.exe文章,不在这介绍(主要是我的写作能力太差).我写这个日记主要是项记录访问w ...

  2. PHP基于SOAP实现webservice

    简单对象访问协议(SOAP)是一种轻量的.简单的.基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息. SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( H ...

  3. Android调用基于.net的WebService

    在实际开发项目中,有时候会为Android开发团队提供一些接口,一般是以asmx文件的方式来承载.而公布出去的数据一般上都是标准的json数据.但是在实际过程中,发现Android团队那边并不是通过将 ...

  4. C# WebService创建、发布、调用的简单例子

    Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...

  5. 使用CXF实现基于Soap协议的WebService

    本文介绍使用CXF实现基于Soap协议的WebService(CXF的版本是3.0.0) 一. 前言 Java有三种WebService规范:Jax-WS,Jax-RS,Jaxm 1. Jax-WS( ...

  6. 第二篇:利用shell脚本执行webservice请求——基于soap

    1. 项目背景 以往我们在开发基于webservice的项目中,我们总习惯于直接使用webservice的一些框架,如Axis,axis2和Xfire等.框架的好处是将webservice所涉及到的s ...

  7. 使用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     ...

  8. 使用axis2进行webservice发布与调用

    一.介绍下cxf.axis.axis2区别 新一代的Web Services 框架如Axis2.CXF 都是由现有的项目中逐渐演化而来的,Axis2 是由大家熟悉的Axis 1.x 系列演化过来,而A ...

  9. Android与服务器端数据交互(基于SOAP协议整合android+webservice)

    http://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html 上一节中我们通过http协议,采用HttpClient向服务器端a ...

随机推荐

  1. 6.如何使用jedis的线程池

    Basic usage example using Jedis in a multithreaded environment You shouldn't use the same instance f ...

  2. python2和python3中的类

    经典类与新式类 例如: A B C D 四个类 D 包含 BC :   B和C分别包含A py2 在经典类中是按深度优先来继承 例如: D中查找B,B没有从A中查找 新式类中是按广度优先来查找继承的 ...

  3. 全面解释java中StringBuilder、StringBuffer、String类之间的关系

    StringBuilder.StringBuffer.String类之间的关系 java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,在上一篇博文中我 ...

  4. usaco 2002 月赛 Fiber Communications 题解

    Description Farmer John wants to connect his N (1 <= N <= 1,000) barns (numbered 1..N) with a ...

  5. STL—vector

    前面介绍了STL对象的构造与析构以及内存的配置与释放,那具体的容器是怎么应用STL的空间配置器的呢?这篇先介绍STL的容器vector. vector的数据成员 vector只有4个数据成员:3个迭代 ...

  6. linux中grep命令的用法

    作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的. 首先谈一下grep命令的常用格式为:[grep  [选项]  "模式"  [ ...

  7. jQuery点击缩略图切换大图代码

    很多网站上都会有点击缩略图切换成大图的效果,下面来分享一下它的源码 还是先来看效果截图 运行文件 然后点击下一张 下面分享源代码 html文件 <!DOCTYPE html PUBLIC &qu ...

  8. table初始化

    table, th , td { border: 1px solid grey; border-collapse: collapse; padding: 5px;}

  9. iOS开发实战-时光记账Demo 本地数据库版

    现在记账APP也是用途比较广泛 自己写了个简单的demo 欢迎指正 效果 分析 1.思维推导 首先简单的做了下思维推导 2.文件结构 大致框架想好后就可以着手开始准备了 数据库管理:coreData ...

  10. 使用 Router 实现的模块化,如何优雅的回到主页面

    使用 Router 实现的模块化,如何优雅的回到主页面 版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 未经允许,不得转载. 一.前言 现在越来越多的 App ...