在 Python 生态中,开发 SOAP WebService 主要使用 zeep 库,而开发 RESTful WebService 则有 Flask 和 Django 等众多优秀框架。

下面我将分两部分详细介绍:
- 开发 SOAP WebService (使用
spyne和zeep) - 开发 RESTful WebService (使用
Flask和Flask-RESTful)
第一部分:开发 SOAP WebService
SOAP 是一种基于 XML 的协议,它定义了一套严格的消息格式和通信规则,它通常通过 WSDL (Web Services Description Language) 文件来描述其接口、方法、参数和返回类型。
我们将使用 spyne 库来创建 SOAP 服务器,并用 zeep 库来创建客户端进行测试。
安装依赖
你需要安装 spyne 和 zeep。

pip install spyne zeep
创建 SOAP 服务器 (Server)
我们将创建一个简单的计算器服务,提供 add 和 subtract 两个方法。
代码 (server.py):
from spyne import Application, rpc, ServiceBase, Unicode, Integer
from spyne.protocol.soap import Soap11
from spyne.server.wsgi import WsgiApplication
# 1. 定义一个服务类,继承自 ServiceBase
class CalculatorService(ServiceBase):
# 2. 使用 @rpc 装饰器定义一个远程过程调用
# - name: 参数名
# - type_: 参数类型 (Integer, Unicode 等)
# - _returns: 返回值类型
@rpc(Integer, Integer, _returns=Integer)
def add(ctx, a, b):
"""两个整数相加"""
print(f"收到请求: a={a}, b={b}")
result = a + b
print(f"计算结果: {result}")
return result
@rpc(Integer, Integer, _returns=Integer)
def subtract(ctx, a, b):
"""两个整数相减"""
print(f"收到请求: a={a}, b={b}")
result = a - b
print(f"计算结果: {result}")
return result
# 3. 创建 Spyne 应用
# - tns: Target Namespace (目标命名空间),通常是服务的唯一标识
# - in_protocol, out_protocol: 指定使用 SOAP 1.1 协议
application = Application([CalculatorService], 'spyne.examples.calculator',
in_protocol=Soap11(validator='lxml'),
out_protocol=Soap11())
# 4. 将 Spyne 应用包装成 WSGI 应用
wsgi_application = WsgiApplication(application)
if __name__ == '__main__':
from wsgiref.simple_server import make_server
# 5. 启动一个简单的 WSGI 服务器
server = make_server('0.0.0.0', 8000, wsgi_application)
print("SOAP 服务器启动在 http://127.0.0.1:8000")
print("WSDL 文件地址: http://127.0.0.1:8000/?wsdl")
server.serve_forever()
如何运行服务器?
python server.py
你的 SOAP 服务器就在 8000 端口上运行了,你可以通过浏览器访问 http://127.0.0.1:8000/?wsdl 来查看服务的 WSDL 描述文件。

创建 SOAP 客户端 (Client)
现在我们来创建一个客户端,来调用刚刚创建的 add 方法。
代码 (client.py):
from zeep import Client
# WSDL 文件的地址
wsdl_url = "http://127.0.0.1:8000/?wsdl"
try:
# 1. 创建一个 zeep 客户端,它会自动下载并解析 WSDL 文件
client = Client(wsdl_url)
print("成功连接到 SOAP 服务器")
# 2. 调用服务中的方法
# - client.service.<服务类名>.<方法名>
# - spyne 默认将服务类名作为前缀
result_add = client.service.CalculatorService_add(a=10, b=20)
print(f"10 + 20 = {result_add}")
result_subtract = client.service.CalculatorService_subtract(a=30, b=15)
print(f"30 - 15 = {result_subtract}")
except Exception as e:
print(f"发生错误: {e}")
如何运行客户端?
(确保 server.py 正在运行)
python client.py
预期输出:
成功连接到 SOAP 服务器
10 + 20 = 30
30 - 15 = 15
你会在服务器的控制台看到相应的打印信息。
第二部分:开发 RESTful WebService
REST 是一种更现代、更简单的架构风格,它使用 HTTP 协议的标准方法(GET, POST, PUT, DELETE)来操作资源(Resource),资源通常用 URI (Uniform Resource Identifier) 来标识,数据交换格式通常是轻量级的 JSON。
我们将使用 Flask 这个轻量级 Web 框架来创建 RESTful API。
安装依赖
pip install Flask flask-restful
创建 RESTful API 服务器 (Server)
我们将创建一个简单的用户管理 API,可以获取所有用户、根据 ID 获取单个用户、创建新用户。
代码 (app.py):
from flask import Flask, request
from flask_restful import Api, Resource, abort
# 1. 创建 Flask 应用和 Api 实例
app = Flask(__name__)
api = Api(app)
# 模拟一个数据库
users = {
1: {"name": "Alice", "age": 30},
2: {"name": "Bob", "age": 25},
}
user_id_counter = 3
# 2. 创建一个 Resource 类
class User(Resource):
def get(self, user_id):
"""获取单个用户"""
if user_id not in users:
# 如果用户不存在,返回 404 错误
abort(404, message=f"用户 {user_id} 不存在")
return users[user_id]
def delete(self, user_id):
"""删除一个用户"""
if user_id not in users:
abort(404, message=f"用户 {user_id} 不存在")
del users[user_id]
return '', 204 # 返回一个没有内容的响应,状态码为 204
class UserList(Resource):
def get(self):
"""获取所有用户列表"""
return users
def post(self):
"""创建一个新用户"""
global user_id_counter
# 从请求的 JSON 数据中获取信息
data = request.get_json()
if not data or 'name' not in data:
abort(400, message="请提供用户名")
new_user_id = user_id_counter
users[new_user_id] = {"name": data['name'], "age": data.get('age', 0)}
user_id_counter += 1
# 返回新创建的用户,状态码为 201 (Created)
return users[new_user_id], 201
# 3. 将 Resource 添加到 API 中,并指定 URL 路由
api.add_resource(UserList, '/users')
api.add_resource(User, '/users/<int:user_id>')
if __name__ == '__main__':
app.run(debug=True)
如何运行服务器?
python app.py
服务器将在 5000 端口启动。
测试 RESTful API
你可以使用 curl 命令或者 Postman 等工具来测试你的 API。
获取所有用户 (GET)
curl http://127.0.0.1:5000/users
预期输出:
{
"1": {
"age": 30,
"name": "Alice"
},
"2": {
"age": 25,
"name": "Bob"
}
}
获取单个用户 (GET)
curl http://127.0.0.1:5000/users/1
预期输出:
{
"age": 30,
"name": "Alice"
}
创建新用户 (POST)
curl -X POST -H "Content-Type: application/json" -d '{"name":"Charlie", "age":35}' http://127.0.0.1:5000/users
预期输出:
{
"age": 35,
"name": "Charlie"
}
删除用户 (DELETE)
curl -X DELETE http://127.0.0.1:5000/users/2
预期输出: (没有内容,状态码 204)
再次获取所有用户,你会看到 Bob 已经被删除了。
总结与对比
| 特性 | SOAP (使用 spyne) |
RESTful (使用 Flask-RESTful) |
|---|---|---|
| 协议 | 严格基于 XML,通常通过 HTTP/SOAP 协议传输。 | 基于 HTTP 协议,使用标准方法 (GET, POST, etc.)。 |
| 数据格式 | 强制使用 XML。 | 通常使用 JSON,也可以使用 XML、HTML 等。 |
| 标准 | 有严格的国际标准 (WSDL, SOAP)。 | 更像一种架构风格,没有官方标准。 |
| 性能 | 由于 XML 和额外的 SOAP 头部,通常较重,性能较低。 | 轻量级,通常性能更高。 |
| 复杂性 | 配置复杂,学习曲线较陡峭。 | 简单直观,易于理解和实现。 |
| 安全性 | 内置安全标准和机制 (WS-Security)。 | 依赖 HTTP(S) 的安全机制。 |
| 适用场景 | 企业级应用、金融、电信等对事务和安全要求极高的场景。 | Web 应用、移动应用后端、微服务、大多数现代互联网应用。 |
如何选择?
- 选择 SOAP: 如果你的项目需要与遗留的、基于 SOAP 的企业系统(如银行、ERP 系统)集成,或者你对事务的 ACID 特性、安全性和标准化有极高的要求。
- 选择 REST: 对于绝大多数新的 Web 项目、移动 App 后端或微服务架构,REST 是首选,它更简单、更灵活、更易于与前端技术(如 JavaScript)集成。
希望这份详细的指南能帮助你开始使用 Python 开发 WebService!
