前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python SOAP 调用

Python SOAP 调用

作者头像
py3study
发布2020-01-10 16:42:37
1.8K0
发布2020-01-10 16:42:37
举报
文章被收录于专栏:python3python3

python编写SOAP服务

SOAP简介 引用

简单对象访问协议(SOAP,全写为Simple Object Access Protocol)是一种标准化的通讯规范,主要用于Web服务(web service)中。SOAP的出现是为了简化网页服务器(Web Server)在从XML数据库中提取数据时,无需花时间去格式化页面,并能够让不同应用程序之间透过HTTP通讯协定,以XML格式互相交换彼此的数据,使其与编程语言、平台和硬件无关 参考:http://zh.wikipedia.org/wiki/SOAP http://www.ibm.com/developerworks/cn/xml/x-sisoap/index.html python的soap包

引用 Older libraries:     SOAPy: Was the "best," but no longer maintained. Does not work on Python 2.5+     ZSI: Very painful to use, and development is slow. Has a module called "SOAPpy", which is different than SOAPy (above). "Newer" libraries:     SUDS: Very Pythonic, and easy to create WSDL-consuming SOAP clients. Creating SOAP servers is a little bit more difficult.     soaplib: Creating servers is easy, creating clients a little bit more challenging.     ladon: Creating servers is much like in soaplib (using a decorator). Ladon exposes more interfaces than SOAP at the same time without extra user code needed.     pysimplesoap: very lightweight but useful for both client and server - includes a web2py server integration that ships with web2py. 参考: http://stackoverflow.com/questions/206154/whats-the-best-soap-client-library-for-python-and-where-is-the-documentation-f 用SOAPpy编写的一个简单例子 SOAPpy包:http://pypi.python.org/pypi/SOAPpy/ A simple "Hello World" http SOAP server:

Python代码  

收藏代码
收藏代码
代码语言:javascript
复制
import SOAPpy  
def hello():  
 return "Hello World" 
server = SOAPpy.SOAPServer(("localhost", 8080))  
server.registerFunction(hello)  
server.serve_forever()  

And the corresponding client:

Python代码  

收藏代码
收藏代码
代码语言:javascript
复制
import SOAPpy  
server = SOAPpy.SOAPProxy("http://localhost:8080/")  
print server.hello()  

soaplib编写soap server 选用soaplib,因为看对各包的简介,soaplib对服务器端的编写更加简单 soaplib包: http://pypi.python.org/pypi/soaplib/0.8.1 soaplib 2.0的安装 git clone git://github.com/soaplib/soaplib.git cd soaplib python setup.py install 参考:http://soaplib.github.com/soaplib/2_0/ soaplib2.0 和 wsgi webserver 编写的一个简单例子 Declaring a Soaplib Service

Python代码  

收藏代码
收藏代码
代码语言:javascript
复制
import soaplib  
from soaplib.core.service import rpc, DefinitionBase  
from soaplib.core.model.primitive import String, Integer  
from soaplib.core.server import wsgi  

from soaplib.core.service import soap

from soaplib.core.model.clazz import Array  
 
 
class HelloWorldService(DefinitionBase):  
    @soap(String,Integer,_returns=Array(String))  
 def say_hello(self,name,times):  
        results = []  
 for i in range(0,times):  
            results.append('Hello, %s'%name)  
 return results  
 
if __name__=='__main__':  
 try:  
 from wsgiref.simple_server import make_server  
        soap_application = soaplib.core.Application([HelloWorldService], 'tns')  
        wsgi_application = wsgi.Application(soap_application)  
        server = make_server('localhost', 7789, wsgi_application)  
        server.serve_forever()  
 except ImportError:  
 print "Error: example server code requires Python >= 2.5" 

SOAP Client

Python代码  

收藏代码
收藏代码
代码语言:javascript
复制
>>> from suds.client import Client  
>>> hello_client = Client('http://localhost:7789/?wsdl')  
>>> result = hello_client.service.say_hello("Dave", 5)  
>>> print result  
 
(stringArray){  
   string[] =  
 "Hello, Dave",  
 "Hello, Dave",  
 "Hello, Dave",  
 "Hello, Dave",  
 "Hello, Dave",  
 }  

soaplib 2.0 的一个bug 在运行上面的小例子时,服务器端报错: ......   File "/usr/local/lib/python2.6/dist-packages/soaplib-2.0.0_beta2-py2.6.egg/soaplib/core/_base.py", line 331, in parse_xml_string     return _parse_xml_string(xml_string, charset) NameError: global name 'x' is not defined 修改源码包:/usr/local/lib/python2.6/dist-packages/soaplib-2.0.0_beta2-py2.6.egg/soaplib/core/_base.py line 331

Python代码  

收藏代码
收藏代码
代码语言:javascript
复制
...  
 def parse_xml_string(self, xml_string, charset=None):  
 #return _parse_xml_string(x, charset) 
 return _parse_xml_string(xml_string, charset)  
...  

 

 修改后,例子可以正常运行,这么明显的错误都有,果然是2.0beta版

 用rpclib实现soap server

 文档:http://arskom.github.com/rpclib/

 rpclib服务器端接收对象参数

 一个简单例子的实现

 SERVER

Python代码  

收藏代码
收藏代码
代码语言:javascript
复制
import logging  
from rpclib.application import Application  
from rpclib.decorator import srpc  
from rpclib.interface.wsdl import Wsdl11  
from rpclib.protocol.soap import Soap11  
from rpclib.service import ServiceBase  
from rpclib.model.complex import Iterable  
from rpclib.model.primitive import Integer  
from rpclib.model.primitive import String  
from rpclib.server.wsgi import WsgiApplication  
from rpclib.util.simple import wsgi_soap11_application  
 
class HelloWorldService(ServiceBase):  
    @srpc(String, Integer, _returns=Iterable(String))  
 def say_hello(name, times):  
 ''''' 
        Docstrings for service methods appear as documentation in the wsdl 
        <b>what fun</b> 
        @param name the name to say hello to 
        @param the number of times to say hello 
        @return the completed array 
        ''' 
 print times  
 
 for i in xrange(times):  
 yield u'Hello, %s' % name  
 
if __name__=='__main__':  
 try:  
 from wsgiref.simple_server import make_server  
 except ImportError:  
 print "Error: example server code requires Python >= 2.5" 
 
    logging.basicConfig(level=logging.DEBUG)  
    logging.getLogger('rpclib.protocol.xml').setLevel(logging.DEBUG)  
 
    application = Application([HelloWorldService], 'rpclib.examples.hello.soap', interface=Wsdl11(), in_protocol=Soap11(), out_protocol=Soap11())  
 
    server = make_server('192.168.0.31', 7789, WsgiApplication(application))  
 
 print "listening to http://192.168.0.31:7789" 
 print "wsdl is at: http://192.168.0.31:7789/?wsdl" 
 
    server.serve_forever()  

Client

Python代码  

收藏代码
收藏代码
代码语言:javascript
复制
from suds.client import Client  
c = Client('http://192.168.0.31:7789/?wsdl')  
a = c.service.say_hello(u'punk', 5)  
print a  
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档