现如今面向服务(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. 【OGG】OGG基础知识整理

    [OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...

  2. 简单来说一下ui-route

    UI-Router被认为是AngularUI为开发者提供的最实用的一个模块,它是一个让开发者能够根据URL状态或者说是'机器状态'来组织和控制界面UI的渲染,而不是仅仅只改变路由(传统AngularJ ...

  3. Java 异常处理笔记

    Java程序运行过程中所发生的异常事件可分为两类: §错误(Error):JVM系统内部错误.资源耗尽等严重情况 §违例(Exception): 其它因编程错误或偶然的外在因素导致的一般性问题,例如: ...

  4. 基本的传染病模型:SI、SIS、SIR及其Python代码实现

    本文主要参考博客:http://chengjunwang.com/en/2013/08/learn-basic-epidemic-models-with-python/.该博客有一些笔误,并且有些地方 ...

  5. js&jquery跨域详解jsonp,jquery并发大量请求丢失回调bug

    URL  说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http:/ ...

  6. Webi Report 展示 图片链接 (Image Link)

    最近由于项目需求,在生成的Webi Report中需要增加一列展示相关数据系统的图片链接,要求用户可以通过点击图片链接展示图片. 方法如下: 1,首先找到系统中图片,查看随机一张图片的属性,找到图片的 ...

  7. Spark SQL笔记——技术点汇总

    目录 概述 原理 组成 执行流程 性能 API 应用程序模板 通用读写方法 RDD转为DataFrame Parquet文件数据源 JSON文件数据源 Hive数据源 数据库JDBC数据源 DataF ...

  8. 【NOI模拟】谈笑风生(主席树)

    题目描述 设 T 为一棵有根树,我们做如下的定义: 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称 “ a 比 b 不知道高明到哪里去了 ” . 设 a 和 b 为 T 中 ...

  9. CentOS5.5中卸载自带jdk 安装自己的jdk

    因为需要使用JDK1.6的版本,但是RedHat6.4自带的JDK是1.7版本,因此需要卸载JDK1.7,安装JDK1.6的版本,我使用的JDK1.6版本为:jdk-6u45-Linux-x64.bi ...

  10. session的用法

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...