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 |