现如今面向服务(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. ionicangular 成长日记

    //首先配置文件ionic.bundle.min.jsionic.min.css" //创建一个angular控制器,控制器给body/html都可以angular.module('myap ...

  2. 自定义MapReduce中数据类型

    数据类型(都实现了Writable接口) BooleanWritable 布尔类型 ByteWritable 单字节数值 DoubleWritable 双字节数值 FloatWritable 浮点数 ...

  3. 动态数组ArrayList的使用

    1.定义类 package com.realhope.rmeal.bean; /** * * @author Wucy * 菜谱类 */ public class Menu{ private Inte ...

  4. one plus 1(一加1)刷 kali nethunter 教程

    刚刚入手的一加1,刷成了h2os再进行的本次刷机. 用到以下资源: 链接:http://pan.baidu.com/s/1o7S0xzs 密码:2gvm 好了,开始正题,如果你的系统不是H2OS建议先 ...

  5. C# 中的 ConfigurationManager类引用方法应用程序配置文件App.config的写法

    c#添加了Configuration;后,竟然找不到 ConfigurationManager 这个类,后来才发现:虽然引用了using System.Configuration;这个包,但是还是不行 ...

  6. box-shadow阴影详解

    每次使用box-shadow,都要查阅资料才能实现对应的效果,现在总结一下,方便以后查看. 使用语法: element{box-shadow: inset x-offset y-offset blur ...

  7. HDU 2955 Robberies(DP)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=2955 题目: Problem Description The aspiring Roy the Rob ...

  8. 简单介绍Struts2

    Struts2概述 Struts2虽然是Struts1的基础上发展起来的,但是实质上是以WebWork框架为核心,为传统的Struts1注入了WebWork的设计理念,统一了Struts1和WebWo ...

  9. 51nod_1240:莫比乌斯函数

    题目链接 面向题意编程.. #include<bits/stdc++.h> using namespace std; typedef long long LL; int cal(int n ...

  10. Java之异常处理,日期处理

    Java异常处理 异常:异常就是Java程序在运行过程中出现的错误. 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象.其实就是Java对不正常情况进行描 ...