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