📅  最后修改于: 2020-10-26 05:23:07             🧑  作者: Mango
Web服务是一组基于Web的组件,有助于在应用程序或系统之间交换数据,其中还包括开放协议和标准。可以在网络上发布,使用和找到它。
Web服务具有各种类型,例如RWS(RESTfUL Web服务),WSDL,SOAP等。
一种远程访问协议,它将状态从客户端转移到服务器,该状态可用于操纵状态而不是调用远程过程。
没有定义任何特定的编码或返回有用错误消息的结构和方式。
使用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请求正交的实用程序工具箱。
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方法的列表如下-
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来自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 |