CherryPy - 网络服务
Web 服务是一组基于 Web 的组件,有助于在应用程序或系统之间交换数据,其中还包括开放协议和标准。它可以在网络上发布、使用和查找。
Web 服务有多种类型,例如 RWS(RESTfUL Web 服务)、WSDL、SOAP 等等。
REST — 代表性状态转移
一种远程访问协议,它将状态从客户端传输到服务器,可用于操纵状态而不是调用远程过程。
不定义任何特定的编码或结构以及返回有用错误消息的方式。
使用 HTTP“动词”来执行状态传输操作。
资源使用 URL 进行唯一标识。
它不是 API,而是 API 传输层。
REST 维护网络上资源的命名法,并提供统一的机制来对这些资源执行操作。每个资源由至少一个标识符来标识。如果 REST 基础设施是基于 HTTP 实现的,那么这些标识符被称为统一资源标识符 (URI)。
以下是 URI 集的两个常见子集 -
子集 | 完整形式 | 例子 |
---|---|---|
网址 | 统一资源定位器 | http://www.gmail.com/ |
瓮 | 统一资源名称 | 瓮:isbn:0-201-71088-9 瓮:uuid:13e8cf26-2a25-11db-8693-000ae4ea7d46 |
在了解CherryPy架构的实现之前,我们先来重点了解一下CherryPy的架构。
CherryPy 包括以下三个组件 -
cherrypy.engine - 它控制进程启动/拆卸和事件处理。
cherrypy.server - 它配置和控制 WSGI 或 HTTP 服务器。
cherrypy.tools - 与处理 HTTP 请求正交的实用程序工具箱。
通过 CherryPy 的 REST 接口
RESTful Web 服务在以下内容的帮助下实现了 CherryPy 架构的每个部分 -
- 验证
- 授权
- 结构
- 封装
- 错误处理
验证
身份验证有助于验证与我们交互的用户。CherryPy 包含处理每种身份验证方法的工具。
def authenticate(): if not hasattr(cherrypy.request, 'user') or cherrypy.request.user is None: # < Do stuff to look up your users > cherrypy.request.authorized = False # This only authenticates. Authz must be handled separately. cherrypy.request.unauthorized_reasons = [] cherrypy.request.authorization_queries = [] cherrypy.tools.authenticate = \ cherrypy.Tool('before_handler', authenticate, priority=10)
上述函数authenticate()将有助于验证客户端或用户的存在。内置工具有助于以系统的方式完成该过程。
授权
授权有助于通过 URI 维护流程的健全性。该过程还有助于通过用户令牌引导来变形对象。
def authorize_all(): cherrypy.request.authorized = 'authorize_all' cherrypy.tools.authorize_all = cherrypy.Tool('before_handler', authorize_all, priority=11) def is_authorized(): if not cherrypy.request.authorized: raise cherrypy.HTTPError("403 Forbidden", ','.join(cherrypy.request.unauthorized_reasons)) cherrypy.tools.is_authorized = cherrypy.Tool('before_handler', is_authorized, priority = 49) cherrypy.config.update({ 'tools.is_authorized.on': True, 'tools.authorize_all.on': True })
正如前面的示例中提到的,内置的授权工具有助于以系统的方式处理例程。
结构
维护 API 的结构有助于减少映射应用程序 URI 的工作量。保持 API 的可发现性和清洁性始终是必要的。CherryPy 框架的 API 基本结构应具有以下内容 -
- 帐户和用户
- 自动回复器
- 接触
- 文件
- 文件夹
- 列表和字段
- 消息和批量
封装
封装有助于创建轻量级、人类可读且可供各种客户端访问的 API。项目列表以及创建、检索、更新和删除需要封装 API。
错误处理
如果 API 无法按特定本能执行,则此过程会管理错误(如果有)。例如,400 表示错误请求,403 表示未经授权的请求。
例子
请考虑以下作为数据库、验证或应用程序错误的示例。
import cherrypy import json def error_page_default(status, message, traceback, version): ret = { 'status': status, 'version': version, 'message': [message], 'traceback': traceback } return json.dumps(ret) class Root: _cp_config = {'error_page.default': error_page_default} @cherrypy.expose def index(self): raise cherrypy.HTTPError(500, "Internal Sever Error") cherrypy.quickstart(Root())
上面的代码将产生以下输出 -
由于内置的访问工具,通过 CherryPy 可以轻松管理 API(应用程序编程接口)。
HTTP 方法
对资源进行操作的 HTTP 方法列表如下:
序列号 | HTTP方法及操作 |
---|---|
1. | 头 检索资源元数据。 |
2. | 得到 检索资源元数据和内容。 |
3. | 邮政 请求服务器使用请求正文中包含的数据创建新资源。 |
4. | 放 请求服务器将现有资源替换为请求正文中包含的资源。 |
5. | 删除 请求服务器删除该 URI 标识的资源。 |
6. | 选项 请求服务器返回有关全局或特定资源的功能的详细信息。 |
Atom 发布协议 (APP)
APP 源于 Atom 社区,作为 HTTP 之上的应用程序级协议,允许发布和编辑 Web 资源。APP 服务器和客户端之间的消息单元基于 Atom XML 文档格式。
Atom 发布协议使用 HTTP 及其机制以及 Atom XML 文档格式作为消息单元,定义了 APP 服务和用户代理之间的一组操作。
APP首先定义一个服务文档,该文档向用户代理提供APP服务所服务的不同集合的URI。
例子
让我们举个例子来演示 APP 是如何工作的 -
<?xml version = "1.0" encoding = "UTF-8"?> <service xmlns = "http://purl.org/atom/app#" xmlns:atom = "http://www.w3.org/2005/Atom"> <workspace> <collection href = "http://host/service/atompub/album/"> <atom:title> Albums</atom:title> <categories fixed = "yes"> <atom:category term = "friends" /> </categories> </collection> <collection href = "http://host/service/atompub/film/"> <atom:title>Films</atom:title> <accept>image/png,image/jpeg</accept> </collection> </workspace> </service>
APP 指定如何使用 HTTP 方法对集合成员或集合本身执行基本 CRUD 操作,如下表所示 -
手术 | HTTP方法 | 状态码 | 内容 |
---|---|---|---|
取回 | 得到 | 200 | 代表资源的 Atom 条目 |
创造 | 邮政 | 201 | 通过 Location 和 Content-Location 标头新创建的资源的 URI |
更新 | 放 | 200 | 代表资源的 Atom 条目 |
删除 | 删除 | 200 | 没有任何 |