杰瑞科技汇

Python开发webservice有哪些常用方法?

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

Python开发webservice有哪些常用方法?-图1
(图片来源网络,侵删)

下面我将分两部分详细介绍:

  1. 开发 SOAP WebService (使用 spynezeep)
  2. 开发 RESTful WebService (使用 FlaskFlask-RESTful)

第一部分:开发 SOAP WebService

SOAP 是一种基于 XML 的协议,它定义了一套严格的消息格式和通信规则,它通常通过 WSDL (Web Services Description Language) 文件来描述其接口、方法、参数和返回类型。

我们将使用 spyne 库来创建 SOAP 服务器,并用 zeep 库来创建客户端进行测试。

安装依赖

你需要安装 spynezeep

Python开发webservice有哪些常用方法?-图2
(图片来源网络,侵删)
pip install spyne zeep

创建 SOAP 服务器 (Server)

我们将创建一个简单的计算器服务,提供 addsubtract 两个方法。

代码 (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 描述文件。

Python开发webservice有哪些常用方法?-图3
(图片来源网络,侵删)

创建 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!

分享:
扫描分享到社交APP
上一篇
下一篇