📜  CherryPy-Web服务

📅  最后修改于: 2020-10-26 05:23:07             🧑  作者: Mango


Web服务是一组基于Web的组件,有助于在应用程序或系统之间交换数据,其中还包括开放协议和标准。可以在网络上发布,使用和找到它。

Web服务具有各种类型,例如RWS(RESTfUL Web服务),WSDL,SOAP等。

REST-代表性状态转移

一种远程访问协议,它将状态从客户端转移到服务器,该状态可用于操纵状态而不是调用远程过程。

  • 没有定义任何特定的编码或返回有用错误消息的结构和方式。

  • 使用HTTP“动词”执行状态转移操作。

  • 资源是使用URL唯一标识的。

  • 它不是API,而是API传输层。

REST维护网络上资源的术语,并提供统一的机制来对这些资源执行操作。每个资源由至少一个标识符标识。如果REST基础结构是使用HTTP的基础实现的,则这些标识符称为统一资源标识符(URI)

以下是URI集的两个常见子集-

Subset Full form Example
URL Uniform Resource Locator http://www.gmail.com/
URN Uniform Resource Name 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请求正交的实用程序工具箱。

通过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。

错误处理

如果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方法的列表如下-

S.No HTTP Method & Operation
1.

HEAD

Retrieves the resource metadata.

2.

GET

Retrieves the resource metadata and content.

3.

POST

Requests the server to create a new resource using the data enclosed in the request body.

4.

PUT

Requests the server to replace an existing resource with the one enclosed in the request body.

5.

DELETE

Requests the server to remove the resource identified by that URI.

6.

OPTIONS

Requests the server to return details about capabilities either globally or specifically towards a resource.

原子发布协议(APP)

APP来自Atom社区,它是HTTP之上的应用程序级协议,用于发布和编辑Web资源。 APP服务器和客户端之间的消息单位基于Atom XML文档格式。

Atom发布协议使用HTTP及其机制以及Atom XML文档格式作为消息单元,定义了APP服务与用户代理之间的一组操作。

APP首先定义一个服务文档,该文档向用户代理提供APP服务所服务的不同集合的URI。

让我们以一个例子来演示APP如何工作-



   
   
      
          Albums
         
            
         
      
      
      
         Films
         image/png,image/jpeg
      
   
    

APP规定了如何使用下表所述的HTTP方法对集合的成员或集合本身执行基本的CRUD操作-

Operation HTTP Method Status Code Content
Retrieve GET 200 An Atom entry representing the resource
Create POST 201 The URI of the newly created resource via the Location and Content-Location headers
Update PUT 200 An Atom entry representing the resource
Delete DELETE 200 None