Web服务是一组基于Web的组件,有助于在应用程序或系统之间交换数据,这些数据还包括开放协议和标准.它可以在网上发布,使用和找到.
Web服务有各种类型,如RWS(RESTfUL Web服务),WSDL,SOAP等等.
一种远程访问协议,它将状态从客户端传输到服务器,可用于操作状态而不是调用远程过程./p>
不定义任何特定的编码或结构以及返回有用错误消息的方法.
使用HTTP"动词"执行状态转移操作.
使用URL唯一标识资源.
它不是API,而是API传输层.
REST维护网络上资源的命名,并提供统一的机制来对这些资源执行操作.每个资源由至少一个标识符标识.如果REST基础结构是以HTTP为基础实现的,则这些标识符称为统一资源标识符(URI).
以下是两个常见子集URI set :
子集 | 完整格式 | 示例 |
---|---|---|
URL | 统一资源定位器 | http://www.gmail.com/ |
URN | 统一资源名称 | urn:isbn:0-201-71088-9 urn:uuid:13e8cf26-2a25-11db-8693-000ae4ea7d46 |
在了解CherryPy架构的实现之前,让我们关注CherryPy的架构.
CherryPy包含以下内容三个组成部分 :
cherrypy.engine &minu S;它控制流程启动/拆卸和事件处理.
cherrypy.server : 它配置和控制WSGI或HTTP服务器.
cherrypy.tools : 与处理HTTP请求正交的实用工具箱.
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结构有助于减少mappin的工作量g应用程序的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())
以上代码将产生以下输出 :
API管理(应用程序编程接口)很容易通过CherryPy,因为内置的访问工具.
操作的HTTP方法列表资源如下 :
APP来自Atom社区,作为HTTP之上的应用程序级协议,允许发布和编辑网络资源. APP服务器和客户端之间的消息单元基于Atom XML文档格式.
Atom发布协议定义APP服务和用户代理之间的一组操作使用HTTP及其机制和Atom XML文档格式作为消息单元.
APP首先定义一个服务文档,它为用户代理提供服务的不同集合的URI. APP服务.
APP指定如何使用HTTP方法对集合成员或集合本身执行基本CRUD操作,如下表所示 :
S.No | HTTP方法&操作 |
---|---|
1. | HEAD 检索资源元数据. |
2. | 获取 检索资源元数据和内容. |
3. | POST 请求服务器使用请求正文中包含的数据创建新资源. |
4. | PUT 请求服务器更换包含在请求正文中的现有资源. |
5. | DELETE 请求服务器删除该URI标识的资源. |
6. | 选项 请求服务器全局或特定地向资源返回有关功能的详细信息. |
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操作,如下表所示:
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 |