web服务是一组基于web的组件,有助于在应用程序或系统之间交换数据,这些应用程序或系统还包括开放协议和标准。它可以在网上发布、使用和找到。
Web服务有多种类型,如RWS(restfulweb服务)、WSDL、SOAP等等。
REST — Representational State Transfer
一种远程访问协议,它将状态从客户端传输到服务器,服务器可用来操作状态,而不是调用远程过程。
不定义任何特定的编码或结构以及返回有用错误消息的方式。
使用HTTP“动词”执行状态传输操作。
资源是使用URL唯一标识的。
它不是一个API,而是一个API传输层。
REST维护网络上资源的命名,并提供对这些资源执行操作的统一机制。每个资源由至少一个标识符标识。如果REST基础设施是以HTTP为基础实现的,那么这些标识符被称为统一资源标识符(Uniform Resource identifiers,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
tools是与处理HTTP请求正交的实用程序工具箱。
REST Interface through CherryPy
RESTful web服务通过以下帮助实现CherryPy体系结构的每个部分:;
- Authentication
- Authorization
- Structure
- Encapsulation
- Error Handling
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的基本结构应该有以下几个方面:;
- Accounts and User
- Autoresponder
- Contact
- File
- Folder
- List and field
- Message and Batch
Encapsulation
封装有助于创建轻量级、可读性和可供各种客户端访问的API。项目列表以及创建、检索、更新和删除都需要封装API。
Error Handling
如果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 Methods
对资源进行操作的HTTP方法列表如下−
S.No | HTTP Method & Operation |
---|---|
1. | 头部 检索资源元数据。 |
2. | 我不知道。我不知道。 检索资源元数据和内容。 |
3. | 岗位 请求服务器使用请求正文中包含的数据创建新资源。 |
4. | 投入 请求服务器用请求正文中包含的资源替换现有资源。 |
5. | 删除 请求服务器删除由该URI标识的资源。 |
6. | 选项 请求服务器返回有关全局或特定于资源的功能的详细信息。 |
Atom Publishing Protocol (APP)
APP是Atom社区的一个应用程序级协议,它位于HTTP之上,允许发布和编辑web资源。应用服务器和客户端之间的消息单元基于Atom XML文档格式。
Atom发布协议使用HTTP及其机制和Atom XML文档格式作为消息单元,定义了应用程序服务和用户代理之间的一组操作。
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操作;