- 基于 SOAP (Simple Object Access Protocol):这是一种比较传统的 WebService 协议,通常基于 XML,具有严格的规范和标准(如 WSDL),它更侧重于企业级的、强类型的、安全的通信。
- 基于 REST (Representational State Transfer):这实际上是一种架构风格,而不是一个严格的协议,它使用 HTTP 协议的标准方法(GET, POST, PUT, DELETE)来操作资源,数据格式通常使用轻量级的 JSON,REST API 是 Web 开发领域的主流,更灵活、更易于使用和调试。
下面我将分别介绍如何使用 Python 搭建这两种类型的 WebService。

使用 Flask + Zeep 搭建 SOAP WebService
我们将创建一个简单的 SOAP 服务,它提供一个计算器功能(加法),并生成一个 WSDL 文件供客户端调用。
安装依赖
你需要安装 Flask 和处理 SOAP 的库 zeep。
pip install flask zeep
编写 SOAP 服务端代码 (server.py)
这个文件将包含我们的 WebService 逻辑。
from flask import Flask, request, Response
from zeep import xsd
from zeep.plugins import HistoryPlugin
# 创建 Flask 应用
app = Flask(__name__)
# 定义 WSDL 数据类型
# 这是一个复杂的类型,包含两个整数
AddRequest = xsd.ComplexType([
xsd.Element('intA', xsd.Integer),
xsd.Element('intB', xsd.Integer)
])
# 定义响应类型,包含一个整数
AddResponse = xsd.ComplexType([
xsd.Element('result', xsd.Integer)
])
# 创建服务
service = xsd.Service(
'CalculatorService',
port_type='CalculatorPortType',
operations={
'Add': xsd.Operation(
'Add',
request=AddRequest,
response=AddResponse
)
}
)
# 实现 Add 操作
def add_operation(intA, intB):
print(f"收到加法请求: {intA} + {intB}")
result = intA + intB
print(f"返回结果: {result}")
return {'result': result}
# 将实现绑定到操作
service['Add'].function = add_operation
# 生成 WSDL 内容
wsdl = service.wsdl()
@app.route('/wsdl', methods=['GET'])
def get_wsdl():
"""提供一个端点来获取 WSDL 文件"""
return Response(wsdl, mimetype='application/xml')
@app.route('/calculator', methods=['POST'])
def calculator():
"""处理 SOAP 请求的核心端点"""
# 获取原始请求数据
soap_action = request.headers.get('SOAPAction')
if not soap_action:
return "Missing SOAPAction header", 400
# 解析 SOAP Action 来确定调用哪个操作
# "Add" 对应 service['Add']
operation_name = soap_action.strip('"')
try:
operation = service[operation_name]
except KeyError:
return f"Operation '{operation_name}' not found", 404
# 这里简化了,实际 zeep 有更强大的客户端来解析和构建 SOAP 消息
# 对于生产环境,建议使用专门的 SOAP 框架如 spyne 或 django-soap
# 此示例主要展示 WSDL 的生成和基本概念
# 由于手动解析 XML 复杂,我们在这里简化处理,假设客户端已经知道如何调用
# 实际应用中,你会用 zeep 的服务端模式或 spyne 等库来处理请求/响应的序列化
return "SOAP endpoint reached. For a full implementation, consider using 'spyne' or 'django-soap'.", 200
if __name__ == '__main__':
# 启动 Flask 开发服务器
# 注意:这个简单的 Flask 实现无法完整处理 SOAP 请求的细节
# 它主要用于展示 WSDL 的生成,完整的 SOAP 服务端实现更复杂。
print("SOAP Server (Flask-based) running on http://127.0.0.1:5000")
print("WSDL available at: http://127.0.0.1:5000/wsdl")
app.run(debug=True)
重要提示:上面的 Flask 示例并不完整,因为它没有手动解析和构建复杂的 SOAP 信封,使用 Flask 原生实现一个健壮的 SOAP 服务非常繁琐。

更推荐的 SOAP 库是 spyne,它专门为构建 RPC(如 SOAP)服务而设计,更强大、更规范,如果你需要真正的 SOAP 服务,强烈建议研究 spyne。
使用 Flask 搭建 RESTful WebService (推荐)
这是目前最流行、最简单的方式,我们将创建一个管理用户信息的 REST API。
安装依赖
Flask 自带开发服务器,但对于生产环境,推荐使用 gunicorn 或 uWSGI,这里我们只安装 Flask。
pip install Flask
编写 RESTful API 代码 (app.py)
我们将创建几个端点来展示 RESTful 的核心概念:对用户资源的增删改查。

from flask import Flask, jsonify, request
# 创建 Flask 应用实例
app = Flask(__name__)
# 模拟一个数据库
# 在真实应用中,这里会连接到 PostgreSQL, MySQL, MongoDB 等
users = [
{'id': 1, 'name': 'Alice', 'email': 'alice@example.com'},
{'id': 2, 'name': 'Bob', 'email': 'bob@example.com'}
]
next_user_id = 3
# 路由和视图函数
# 1. 获取所有用户 (GET /users)
@app.route('/users', methods=['GET'])
def get_users():
"""返回用户列表"""
return jsonify({'users': users})
# 2. 获取单个用户 (GET /users/<int:user_id>)
@app.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
"""返回指定ID的用户"""
user = next((u for u in users if u['id'] == user_id), None)
if user is None:
# 如果用户不存在,返回 404 Not Found
return jsonify({'error': 'User not found'}), 404
return jsonify({'user': user})
# 3. 创建新用户 (POST /users)
@app.route('/users', methods=['POST'])
def create_user():
"""创建一个新用户"""
# 检查请求体是否为 JSON
if not request.is_json:
return jsonify({'error': 'Request must be JSON'}), 400
data = request.get_json()
# 验证必要字段
if 'name' not in data or 'email' not in data:
return jsonify({'error': 'Missing name or email in request'}), 400
# 创建新用户
new_user = {
'id': next_user_id,
'name': data['name'],
'email': data['email']
}
users.append(new_user)
next_user_id += 1
# 返回新创建的用户,并设置状态码为 201 Created
return jsonify({'user': new_user}), 201
# 4. 更新用户 (PUT /users/<int:user_id>)
@app.route('/users/<int:user_id>', methods=['PUT'])
def update_user(user_id):
"""更新指定ID的用户"""
user = next((u for u in users if u['id'] == user_id), None)
if user is None:
return jsonify({'error': 'User not found'}), 404
if not request.is_json:
return jsonify({'error': 'Request must be JSON'}), 400
data = request.get_json()
# 更新用户信息
user['name'] = data.get('name', user['name'])
user['email'] = data.get('email', user['email'])
return jsonify({'user': user})
# 5. 删除用户 (DELETE /users/<int:user_id>)
@app.route('/users/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):
"""删除指定ID的用户"""
global users
original_length = len(users)
users = [u for u in users if u['id'] != user_id]
if len(users) == original_length:
# 如果列表长度没变,说明用户不存在
return jsonify({'error': 'User not found'}), 404
return jsonify({'message': 'User deleted successfully'}), 200
# 运行应用
if __name__ == '__main__':
# debug=True 可以在代码修改后自动重启服务器,并在出错时显示详细错误信息
app.run(debug=True)
测试你的 REST API
运行 app.py:
python app.py
服务将在 http://127.0.0.1:5000 启动,你可以使用 curl 或 Postman 等工具来测试 API。
测试示例 (使用 curl):
-
获取所有用户:
curl http://127.0.0.1:5000/users
-
创建新用户:
curl -X POST -H "Content-Type: application/json" -d '{"name":"Charlie", "email":"charlie@example.com"}' http://127.0.0.1:5000/users -
获取单个用户 (ID为1):
curl http://127.0.0.1:5000/users/1
-
更新用户 (ID为1):
curl -X PUT -H "Content-Type: application/json" -d '{"name":"Alice Smith"}' http://127.0.0.1:5000/users/1 -
删除用户 (ID为2):
curl -X DELETE http://127.0.0.1:5000/users/2
使用 Django REST framework (DRF) 搭建 RESTful WebService
如果你的项目更复杂,或者你更偏爱 Django 的“全家桶”生态,Django REST framework (DRF) 是最佳选择,它提供了强大的、功能丰富的工具来构建 API。
安装依赖
pip install django djangorestframework
创建项目和应用
# 创建一个名为 myapi 的 Django 项目 django-admin startproject myapi # 进入项目目录 cd myapi # 创建一个名为 users 的应用 python manage.py startapp users
配置项目
编辑 myapi/settings.py,添加 rest_framework 和 users 应用。
# myapi/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # 添加 DRF
'users', # 添加我们的 users 应用
]
定义模型、序列化器和视图
users/models.py: 定义数据模型。
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
def __str__(self):
return self.name
users/serializers.py: 创建序列化器,将模型实例转换为 JSON。
from rest_framework import serializers
from .models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'name', 'email']
users/views.py: 创建 API 视图。
from rest_framework import viewsets
from .models import User
from .serializers import UserSerializer
# ModelViewSet 自动提供了 list, create, retrieve, update, destroy 等操作
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all().order_by('-id')
serializer_class = UserSerializer
users/urls.py: 为应用创建 URL 配置。
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import UserViewSet
# 创建一个路由器并注册我们的视图集
router = DefaultRouter()
router.register(r'users', UserViewSet)
# API URL 现在由路由器自动确定
urlpatterns = [
path('', include(router.urls)),
]
myapi/urls.py: 在主项目中包含应用的 URL。
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('users.urls')), # 将 /api/ 开头的请求都交给 users.urls 处理
]
运行和迁移数据库
# 创建数据库迁移文件 python manage.py makemigrations # 应用迁移,创建实际的数据库表 python manage.py migrate # 启动开发服务器 python manage.py runserver
测试 API
DRF 自动生成了非常方便的 API 端点,并且自带一个可浏览的 API 界面。
- 访问用户列表 (可浏览界面):
打开浏览器访问
http://127.0.0.1:8000/api/users/,你可以在这里直接进行增删改查操作,非常方便。 - 获取所有用户 (JSON):
curl http://127.0.0.1:8000/api/users/
- 创建新用户 (JSON):
curl -X POST -H "Content-Type: application/json" -d '{"name":"David", "email":"david@example.com"}' http://127.0.0.1:8000/api/users/
总结与对比
| 特性 | SOAP (使用 zeep/spyne) | REST (使用 Flask) | REST (使用 Django REST framework) |
|---|---|---|---|
| 协议/风格 | 严格协议 | 架构风格 | 架构风格 |
| 数据格式 | XML ( | JSON ( | JSON (默认,也支持其他) |
| 标准化 | 高 (WSDL, WS-*) | 低 (依赖 HTTP 标准) | 低 (依赖 HTTP 标准) |
| 性能 | 较低 (XML 解析开销大) | 高 (JSON 解析快) | 高 (JSON 解析快) |
| 易用性 | 复杂,学习曲线陡峭 | 简单,直观 | 功能强大,但学习 DRF 本身需要时间 |
| 工具/库 | zeep, spyne, suds-py3 | Flask, FastAPI, Django | Django REST framework |
| 适用场景 | 企业级应用、银行、金融等对安全和事务有高要求的旧系统 | 快速原型、中小型项目、微服务 | 复杂的 Web 应用、需要强大后台管理、认证、权限等功能的 API |
| 调试 | 困难 (需要 SOAP 客户端工具) | 简单 (可直接用浏览器或 curl) | 非常方便 (自带可浏览 API) |
如何选择?
- 如果你需要构建一个传统的、与 Java .NET 等企业系统集成的 WebService,并且对方要求使用 SOAP,那么选择 方案一,并优先考虑
spyne库。 - 如果你在构建一个新的现代 Web 应用、微服务或移动应用的后端 API,99% 的情况下都应该选择 REST。
- 如果项目规模小,追求快速开发和灵活性,方案二 (Flask) 是绝佳选择。
- 如果项目规模较大,或者你已经在使用 Django 生态系统,希望获得开箱即用的强大功能(如认证、权限、后台管理、文档等),方案三 (Django REST framework) 是不二之选。
