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操作;