CherryPy - Serviços da Web

Um serviço da web é um conjunto de componentes baseados na web que auxiliam na troca de dados entre a aplicação ou sistemas que também inclui protocolos e padrões abertos. Ele pode ser publicado, usado e encontrado na web.

Os serviços da Web são de vários tipos, como RWS (RESTfUL Web Service), WSDL, SOAP e muitos mais.

REST - Transferência de Estado Representacional

Um tipo de protocolo de acesso remoto, que transfere o estado do cliente para o servidor, que pode ser usado para manipular o estado em vez de chamar procedimentos remotos.

  • Não define nenhuma codificação ou estrutura específica e formas de retornar mensagens de erro úteis.

  • Usa "verbos" HTTP para realizar operações de transferência de estado.

  • Os recursos são identificados exclusivamente por meio de URL.

  • Não é uma API, mas sim uma camada de transporte de API.

REST mantém a nomenclatura de recursos em uma rede e fornece um mecanismo unificado para executar operações nesses recursos. Cada recurso é identificado por pelo menos um identificador. Se a infraestrutura REST for implementada com a base de HTTP, esses identificadores são denominados comoUniform Resource Identifiers (URIs).

A seguir estão os dois subconjuntos comuns do conjunto URI -

Subconjunto Formulário completo Exemplo
URL localizador padrão de recursos http://www.gmail.com/
URNA Nome de recurso uniforme urn: isbn: 0-201-71088-9 urn: uuid: 13e8cf26-2a25-11db-8693-000ae4ea7d46

Antes de entender a implementação da arquitetura CherryPy, vamos nos concentrar na arquitetura do CherryPy.

CherryPy inclui os seguintes três componentes -

  • cherrypy.engine - Controla a inicialização / desmontagem de processos e o tratamento de eventos.

  • cherrypy.server - Configura e controla o servidor WSGI ou HTTP.

  • cherrypy.tools - Uma caixa de ferramentas de utilitários ortogonais ao processamento de uma solicitação HTTP.

Interface REST através do CherryPy

O serviço da web RESTful implementa cada seção da arquitetura CherryPy com a ajuda do seguinte -

  • Authentication
  • Authorization
  • Structure
  • Encapsulation
  • Manipulação de erros

Autenticação

A autenticação ajuda a validar os usuários com os quais estamos interagindo. CherryPy inclui ferramentas para lidar com cada método de autenticação.

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)

A função anterior authenticate () ajudará a validar a existência dos clientes ou usuários. As ferramentas integradas ajudam a completar o processo de forma sistemática.

Autorização

A autorização ajuda a manter a sanidade do processo por meio de URI. O processo também ajuda na transformação de objetos por ligações de token do usuário.

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
})

As ferramentas integradas de autorização auxiliam no manuseio das rotinas de forma sistemática, conforme mencionado no exemplo anterior.

Estrutura

Manter uma estrutura de API ajuda a reduzir a carga de trabalho de mapeamento do URI do aplicativo. É sempre necessário manter a API detectável e limpa. A estrutura básica da API para o framework CherryPy deve ter o seguinte -

  • Contas e usuário
  • Autoresponder
  • Contact
  • File
  • Folder
  • Lista e campo
  • Mensagem e lote

Encapsulamento

O encapsulamento ajuda a criar uma API leve, legível por humanos e acessível a vários clientes. A lista de itens junto com Criação, Recuperação, Atualização e Exclusão requer encapsulamento de API.

Manipulação de erros

Este processo gerencia erros, se houver, se a API falhar na execução de acordo com o instinto específico. Por exemplo, 400 é para solicitação incorreta e 403 é para solicitação não autorizada.

Exemplo

Considere o seguinte como um exemplo para erros de banco de dados, validação ou aplicativo.

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())

O código acima produzirá a seguinte saída -

O gerenciamento de API (Interface de Programação de Aplicativo) é fácil por meio do CherryPy por causa das ferramentas de acesso integradas.

Métodos HTTP

A lista de métodos HTTP que operam nos recursos é a seguinte -

S.No Método e operação HTTP
1

HEAD

Recupera os metadados do recurso.

2

GET

Recupera os metadados e o conteúdo do recurso.

3 -

POST

Solicita que o servidor crie um novo recurso usando os dados incluídos no corpo da solicitação.

4

PUT

Solicita que o servidor substitua um recurso existente por aquele incluído no corpo da solicitação.

5

DELETE

Solicita que o servidor remova o recurso identificado por esse URI.

6

OPTIONS

Solicita que o servidor retorne detalhes sobre os recursos globalmente ou especificamente para um recurso.

Protocolo de Publicação Atom (APP)

O APP surgiu da comunidade Atom como um protocolo de nível de aplicativo acima do HTTP para permitir a publicação e edição de recursos da web. A unidade de mensagens entre um servidor APP e um cliente é baseada no formato de documento Atom XML.

O Atom Publishing Protocol define um conjunto de operações entre um serviço APP e um agente do usuário usando HTTP e seus mecanismos e o formato de documento Atom XML como a unidade de mensagens.

O APP primeiro define um documento de serviço, que fornece ao agente do usuário o URI das diferentes coleções servidas pelo serviço APP.

Exemplo

Vamos dar um exemplo para demonstrar como funciona o 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>

O APP especifica como realizar as operações CRUD básicas em um membro de uma coleção ou na própria coleção usando métodos HTTP, conforme descrito na tabela a seguir -

Operação Método HTTP Código de Status Conteúdo
Recuperar PEGUE 200 Uma entrada Atom que representa o recurso
Crio POSTAR 201 O URI do recurso recém-criado por meio dos cabeçalhos Location e Content-Location
Atualizar COLOCAR 200 Uma entrada Atom que representa o recurso
Excluir EXCLUIR 200 Nenhum