当前位置: 首页 > 文档资料 > CherryPy 入门教程 >

Web 服务(Web Services)

优质
小牛编辑
131浏览
2023-12-01

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.NoHTTP方法和操作
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方法状态代码内容
RetrieveGET200表示资源的Atom条目
CreatePOST201通过Location和Content-Location标头创建的新资源的URI
UpdatePUT200表示资源的Atom条目
DeleteDELETE200None