CherryPy - Servizi Web
Un servizio Web è un insieme di componenti basati sul Web che aiuta nello scambio di dati tra l'applicazione o i sistemi che include anche protocolli e standard aperti. Può essere pubblicato, utilizzato e trovato sul web.
I servizi Web sono di vari tipi come RWS (RESTfUL Web Service), WSDL, SOAP e molti altri.
REST - Trasferimento di stato rappresentativo
Un tipo di protocollo di accesso remoto, che trasferisce lo stato dal client al server che può essere utilizzato per manipolare lo stato invece di chiamare procedure remote.
Non definisce alcuna codifica o struttura specifica e modi per restituire messaggi di errore utili.
Utilizza "verbi" HTTP per eseguire operazioni di trasferimento di stato.
Le risorse vengono identificate in modo univoco tramite URL.
Non è un'API ma piuttosto un livello di trasporto API.
REST mantiene la nomenclatura delle risorse su una rete e fornisce un meccanismo unificato per eseguire operazioni su queste risorse. Ogni risorsa è identificata da almeno un identificatore. Se l'infrastruttura REST è implementata con la base HTTP, questi identificatori vengono definiti comeUniform Resource Identifiers (URIs).
Di seguito sono riportati i due sottoinsiemi comuni del set di URI:
Sottoinsieme | Modulo completo | Esempio |
---|---|---|
URL | Localizzatore di risorse uniformi | http://www.gmail.com/ |
URNA | Nome risorsa uniforme | urna: isbn: 0-201-71088-9 urna: uuid: 13e8cf26-2a25-11db-8693-000ae4ea7d46 |
Prima di comprendere l'implementazione dell'architettura CherryPy, concentriamoci sull'architettura di CherryPy.
CherryPy include i seguenti tre componenti:
cherrypy.engine - Controlla l'avvio / smontaggio del processo e la gestione degli eventi.
cherrypy.server - Configura e controlla il server WSGI o HTTP.
cherrypy.tools - Una cassetta degli attrezzi di utilità ortogonali all'elaborazione di una richiesta HTTP.
Interfaccia REST tramite CherryPy
Il servizio web RESTful implementa ogni sezione dell'architettura CherryPy con l'aiuto di quanto segue:
- Authentication
- Authorization
- Structure
- Encapsulation
- Gestione degli errori
Autenticazione
L'autenticazione aiuta a convalidare gli utenti con cui stiamo interagendo. CherryPy include strumenti per gestire ogni metodo di autenticazione.
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)
La funzione di cui sopra authenticate () aiuterà a convalidare l'esistenza dei client o degli utenti. Gli strumenti integrati aiutano a completare il processo in modo sistematico.
Autorizzazione
L'autorizzazione aiuta a mantenere l'integrità del processo tramite URI. Il processo aiuta anche a trasformare gli oggetti in base ai lead dei token dell'utente.
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
})
Gli strumenti di autorizzazione incorporati aiutano a gestire le routine in modo sistematico, come menzionato nell'esempio precedente.
Struttura
Mantenere una struttura di API aiuta a ridurre il carico di lavoro della mappatura dell'URI dell'applicazione. È sempre necessario mantenere le API rilevabili e pulite. La struttura di base dell'API per il framework CherryPy dovrebbe avere quanto segue:
- Account e utente
- Autoresponder
- Contact
- File
- Folder
- Elenco e campo
- Messaggio e batch
Incapsulamento
L'incapsulamento aiuta nella creazione di API leggere, leggibili e accessibili a vari client. L'elenco degli elementi insieme a Creazione, Recupero, Aggiornamento ed Eliminazione richiede l'incapsulamento dell'API.
Gestione degli errori
Questo processo gestisce gli eventuali errori se l'API non viene eseguita secondo l'istinto particolare. Ad esempio, 400 è per richiesta non valida e 403 è per richiesta non autorizzata.
Esempio
Considera quanto segue come esempio per errori di database, convalida o applicazione.
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())
Il codice precedente produrrà il seguente output:
La gestione dell'API (Application Programming Interface) è semplice tramite CherryPy grazie agli strumenti di accesso integrati.
Metodi HTTP
L'elenco dei metodi HTTP che operano sulle risorse è il seguente:
S.No | Metodo e funzionamento HTTP |
---|---|
1. | HEAD Recupera i metadati della risorsa. |
2. | GET Recupera i metadati e il contenuto della risorsa. |
3. | POST Richiede al server di creare una nuova risorsa utilizzando i dati racchiusi nel corpo della richiesta. |
4. | PUT Richiede al server di sostituire una risorsa esistente con quella racchiusa nel corpo della richiesta. |
5. | DELETE Richiede al server di rimuovere la risorsa identificata da quell'URI. |
6. | OPTIONS Richiede al server di restituire dettagli sulle capacità a livello globale o specifico per una risorsa. |
Atom Publishing Protocol (APP)
L'APP è nata dalla comunità Atom come protocollo a livello di applicazione su HTTP per consentire la pubblicazione e la modifica delle risorse web. L'unità di messaggi tra un server APP e un client si basa sul formato del documento XML Atom.
L'Atom Publishing Protocol definisce un insieme di operazioni tra un servizio APP e uno user-agent utilizzando HTTP e i suoi meccanismi e il formato di documento XML Atom come unità di messaggi.
APP definisce innanzitutto un documento di servizio, che fornisce all'agente utente l'URI delle diverse raccolte servite dal servizio APP.
Esempio
Facciamo un esempio per dimostrare come funziona 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 specifica come eseguire le operazioni CRUD di base su un membro di una raccolta o la raccolta stessa utilizzando i metodi HTTP come descritto nella tabella seguente:
Operazione | Metodo HTTP | Codice di stato | Soddisfare |
---|---|---|---|
Recuperare | OTTENERE | 200 | Una voce Atom che rappresenta la risorsa |
Creare | INVIARE | 201 | L'URI della risorsa appena creata tramite le intestazioni Location e Content-Location |
Aggiornare | METTERE | 200 | Una voce Atom che rappresenta la risorsa |
Elimina | ELIMINA | 200 | Nessuna |