Web 服务(Web Services)
Web服务是一组基于Web的组件,有助于在应用程序或系统之间交换数据,这些数据还包括开放协议和标准。 它可以在网上发布,使用和发现。
Web服务有各种类型,如RWS(RESTfUL Web服务),WSDL,SOAP等等。
REST - 具象国家转移
一种远程访问协议,它将状态从客户端传输到服务器,可用于操作状态而不是调用远程过程。
没有定义任何特定的编码或结构以及返回有用错误消息的方法。
使用HTTP“动词”执行状态转移操作。
使用URL唯一标识资源。
它不是API,而是API传输层。
REST维护网络上资源的命名,并提供统一的机制来对这些资源执行操作。 每个资源由至少一个标识符标识。 如果REST基础结构是以HTTP为基础实现的,则这些标识符称为Uniform Resource Identifiers (URIs) 。
以下是URI集的两个常见子集 -
子集 | 完整形式 | 例 |
---|---|---|
URL | 统一资源定位器 | http://www.gmail.com/ |
URN | 统一资源名称 | urn:isbn:0-201-71088-9 urn:uuid:13e8cf26-2a25-11db-8693-000ae4ea7d46 |
在了解CherryPy架构的实现之前,让我们关注CherryPy的架构。
CherryPy包括以下三个组件 -
cherrypy.engine - 它控制进程启动/拆卸和事件处理。
cherrypy.server - 它配置和控制WSGI或HTTP服务器。
cherrypy.tools - 与处理HTTP请求正交的实用工具箱。
REST接口通过CherryPy
RESTful Web服务在以下帮助下实现CherryPy架构的每个部分 -
- Authentication
- Authorization
- Structure
- Encapsulation
- 错误处理
身份验证 (Authentication)
身份验证有助于验证与我们交互的用户。 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()将有助于验证客户端或用户的存在。 内置工具有助于系统地完成该过程。
授权 (Authorization)
授权有助于通过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
})
内置的授权工具有助于系统地处理例程,如前面的示例所述。
结构 Structure
维护API结构有助于减少映射应用程序URI的工作量。 始终需要保持API可被发现和清洁。 CherryPy框架的API的基本结构应该如下 -
- 帐户和用户
- Autoresponder
- Contact
- File
- Folder
- 列表和字段
- Message and Batch
封装 (Encapsulation)
封装有助于创建轻量级,人类可读且可供各种客户端访问的API。 项目列表以及创建,检索,更新和删除需要封装API。
错误处理
如果API无法以特定的本能执行,此过程将管理错误(如果有)。 例如,400表示错误请求,403表示未授权请求。
例子 (Example)
请考虑以下内容作为数据库,验证或应用程序错误的示例。
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方法列表如下 -
S.No | HTTP方法和操作 |
---|---|
1. | HEAD 检索资源元数据。 |
2. | GET 检索资源元数据和内容。 |
3. | POST 请求服务器使用请求正文中包含的数据创建新资源。 |
4. | PUT 请求服务器将现有资源替换为请求正文中包含的资源。 |
5. | DELETE 请求服务器删除该URI标识的资源。 |
6. | OPTIONS 请求服务器全局或特定地向资源返回有关功能的详细信息。 |
Atom Publishing Protocol (APP)
APP已经从Atom社区出现,作为HTTP之上的应用程序级协议,允许发布和编辑Web资源。 APP服务器和客户端之间的消息单元基于Atom XML文档格式。
Atom发布协议使用HTTP及其机制和Atom XML文档格式作为消息单元,定义APP服务和用户代理之间的一组操作。
APP首先定义服务文档,该服务文档向用户代理提供APP服务所服务的不同集合的URI。
例子 (Example)
让我们举个例子来说明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方法 | 状态代码 | 内容 |
---|---|---|---|
Retrieve | GET | 200 | 表示资源的Atom条目 |
Create | POST | 201 | 通过Location和Content-Location标头创建的新资源的URI |
Update | PUT | 200 | 表示资源的Atom条目 |
Delete | DELETE | 200 | None |