Python实现WebService接口(SOAP)

Web Service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。 [1]

Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

SOAP

SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML(标准通用标记语言下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。例如,你可以使用 SMTP,即因特网电子邮件协议来传递SOAP消息,这可是很有诱惑力的。在传输层之间的头是不同的,但XML有效负载保持相同。

Web Service 希望实现不同的系统之间能够用“软件-软件对话”的方式相互调用,打破了软件应用、网站和各种设备之间的格格不入的状态,实现“基于Web无缝集成”的目标。

目录结构
webservice
	client
		client.py
	server
		app.py
		service.py
使用Python实现服务端

service.py 服务端启动文件

from spyne import Application
from spyne.protocol.soap import Soap11
from spyne.server.wsgi import WsgiApplication
from wsgiref.simple_server import make_server
from webservice.server.app import PyWebService

if __name__ == '__main__':
    soap_app = Application([PyWebService], 'PyWebService',
                           in_protocol=Soap11(validator='lxml'),
                           out_protocol=Soap11())
    wsgi_app = WsgiApplication(soap_app)

    host = "127.0.0.1"
    port = 9567
    server = make_server(host, port, wsgi_app)
    print('WebService Started')
    print('http://' + host + ':' + str(port) + '/PyWebService/?wsdl')
    server.serve_forever()

app.py webservice接口

import json

from spyne import ServiceBase, rpc, Double
from spyne import Integer, Unicode, String


class User(object):
    def __init__(self, age, user_name):
        self.age = age
        self.user_name = user_name
        self.sex = 0

    def get_user_list(self, current_page, page_size):
        l = []
        for i in range(10):
            l.append({'age': self.age, 'sex': self.sex, 'user_name': self.user_name})
        return l


user_mgr = User(18, 'Tom')


class PyWebService(ServiceBase):
    ...

    @rpc(_returns=Unicode)
    def get_version(self):
        """
        获取系统版本
        :return:
        """
        return json.dumps({'version': 1.0})

    @rpc(Integer, Integer, _returns=Unicode)
    def get_user_list(self, current_page, page_size):
        """
        获取用户列表
        :return:
        """
        return json.dumps(user_mgr.get_user_list(current_page, page_size))
使用Python实现客户端

client.py

import json
from suds.client import Client

wsdl_url = "http://127.0.0.1:9567/PyWebService/?wsdl"
client = Client(wsdl_url)  # 创建一个webservice接口对象
resp = client.service.get_version()  # 调用这个接口下的get_version方法,无参数
print(json.loads(resp))

上面调用的客户端接口,测试结果如下:

{'version':1.0}