Este artigo introduz a API Cato e analisa um exemplo de aplicação Python.
A API Cato é implementada de acordo com a especificação GraphQL. Embora o GraphQL seja projetado para produzir APIs fáceis de usar, aprender a usar qualquer nova tecnologia ainda requer um investimento de tempo por parte do desenvolvedor. O objetivo deste documento é reduzir o nível desse investimento e explorar uma pequena aplicação Python que executa a chamada da API Cato admins
e simplesmente retorna o número de administradores que foram definidos para uma conta. Ao fazê-lo, os elementos mais importantes de uma aplicação API Cato GraphQL são introduzidos ao leitor.
Nota
Notas:
Espera-se que o leitor tenha um entendimento básico do seguinte:
-
Script ou programação (por exemplo, você está familiarizado com conceitos como variáveis e bibliotecas de código)
-
A especificação JSON (por exemplo, você já trabalhou com documentos JSON)
-
Redes (por exemplo, você conhece a existência do protocolo HTTP e o que é um servidor)
Alguma experiência com a linguagem Python seria benéfica, mas ainda assim, deve ser possível entender o artigo sem isso.
O aplicativo apresentado aqui foi escrito em Python e usa a chamada da API Cato admins
para recuperar o número total de administradores definidos para uma conta. Python e a chamada da API admins
foram escolhidos porque:
-
Python é uma linguagem muito comum, fácil de ler e entender
-
A chamada da API
admins
pode ser usada para criar um exemplo muito simples de chamada da API Cato GraphQL
O programa de exemplo é básico e não contém nenhuma verificação de erros. O programa não faz mais do que imprimir o número total de administradores definidos para a conta.
Nota
Nota: A API Cato não está vinculada a nenhuma linguagem de programação específica. É possível implementar uma aplicação usando qualquer idioma que possa usar a função HTTP POST e processar documentos JSON.
Este programa de exemplo é curto e não inclui nenhuma lógica de tomada de decisão ou código para repetir ações. Poderia ser ainda mais curto combinando algumas das linhas de código em uma única linha. As linhas extras de código foram incluídas para facilitar a explicação do que está acontecendo.
# Importar código de biblioteca Python import os import urllib.request import ssl import json # Obter a Chave API Cato de uma variável de ambiente cato_api_key = os.getenv("CATO_API_KEY") # Criar a solicitação GraphQL a ser enviada get_total_admins = '''{ admins (accountID: 12345) { total } }''' graphql_query = {'query': get_total_admins} # Construir a solicitação HTTP cato_api_url = "https://api.catonetworks.com/api/v1/graphql2" headers = {'x-api-key': cato_api_key, 'Content-Type':'application/json'} unverified_ctx = ssl._create_unverified_context() json_post = json.dumps(graphql_query) json_post_encoded = json_post.encode() request = urllib.request.Request(url=cato_api_url, data=json_post_encoded, headers=headers) # Enviar a consulta e converter a resposta em um dicionário Python response = urllib.request.urlopen(request, context=unverified_ctx, timeout=30) json_response_encoded = response.read() json_response = json_response_encoded.decode() get_admins_total_result = json.loads(json_response) # Extrair o total dos dados retornados e imprimi-lo total = get_admins_total_result['data']['admins']['total'] print('O número total de administradores definidos em sua conta é: {}'.format(total))
Nota
IMPORTANTE! Este programa é fornecido como uma demonstração de como acessar a API Cato com Python. Não é um lançamento oficial do Cato e é fornecido sem garantias de suporte. O tratamento de erros é restrito ao mínimo necessário para que o script funcione com a API e pode não ser suficiente para ambientes de produção.
Todas as perguntas ou comentários devem ser enviados para api@catonetworks.com
O diagrama fornecido abaixo mostra a sequência de eventos que ocorre quando o programa é executado:
-
O programa cria um documento JSON que é enviado para o servidor GraphQL da API Cato.
-
O servidor GraphQL da API Cato verifica para garantir que a chamada de API definida no documento JSON esteja correta e obtém os dados solicitados do serviço Cato.
-
O servidor GraphQL da API Cato retorna os dados para o programa em um arquivo JSON.
Uma das razões para usar Python para o programa de exemplo é a disponibilidade de um rico conjunto de bibliotecas. Essas bibliotecas fornecem funções e objetos que podem lidar com uma ampla gama de tarefas. Agora analisaremos cada biblioteca importada e forneceremos notas para explicar por que ela é necessária.
import os
-
A biblioteca os fornece uma função que permitirá ao código acessar dados contidos nas variáveis de ambiente do sistema operacional.
import urllib.request
-
O módulo
request
da bibliotecaurllib
define a classe Request que cria objetos que podem lidar com a comunicação com servidores remotos acessados via uma URL. -
Isso possibilitará o envio da solicitação da API Cato ao servidor da API Cato GraphQL
import ssl
-
A biblioteca ssl é necessária para criar um contexto não verificado personalizado para as solicitações enviadas ao servidor da API Cato GraphQL.
import json
-
Esta biblioteca contém funções que permitirão converter um dicionário Python em uma string JSON e vice-versa.
-
Essa capacidade de converter entre os dois formatos diferentes facilita muito a escrita de código que pode trabalhar com documentos JSON.
Esta linha de código usa a função de biblioteca getenv para ler a chave API de uma variável de ambiente e atribuí-la a uma variável.
cato_api_key = os.getenv("CATO_API_KEY")
The Cato GraphQL server expects to receive this key in a nHTTP header. A chave não é fornecida no documento JSON porque a especificação GraphQL não inclui autorização como parte do padrão. Incluir autorização no documento JSON seria uma violação da especificação. A chave API Cato é gerada através do Aplicativo de Gerenciamento Cato. Para mais informações sobre a criação de uma chave API, consulte Gerando Chaves de API para a API Cato.
Nota
AVISO! Embora seja possível codificar a chave API Cato em seu código, é altamente recomendado que isso não seja feito.
As próximas linhas de código criam um diretório Python contendo um par de chave/valor. O valor da entrada é construído usando uma string Python multilinha que define a consulta que será enviada ao servidor GraphQL.
get_total_admins = '''{ admins (accountID: 12345) { total } }''' graphql_query = {'query': get_total_admins}
O servidor Cato GraphQL irá interpretar essa string como: execute a função get_total_admins
, passando dois argumentos para ela (accountID e tipo) e retornando apenas o número "total" de entidades. Ou afirmado de forma mais direta, "Retorne o número total de entidades de administradores que estão definidos para o exemplo conta # 12345". This specific example of the admins
API call illustrates an important advantage of a GraphQL API
-
O servidor retorna apenas os dados que a aplicação solicitou
O fato é que a chamada admins
pode retornar muito mais dados. Por exemplo, é possível para uma aplicação solicitar que admins
retorne detalhes sobre cada administrador. No entanto, esta aplicação só precisa saber o número total de administradores. Essa característica do GraphQL evita o que é referido como excesso de busca e pode simplificar significativamente o código necessário para implementar a aplicação.
Nesta seção do programa, um objeto de requisição é construído. Esse objeto será usado para enviar a chamada de API para o servidor GraphQL usando HTTPS. Este objeto de requisição requer informações que são fornecidas por vários outros objetos que precisam ser criados primeiro. Primeiro de tudo, um objeto de string simples é construído para conter a URL do servidor GraphQL para o qual o objeto de requisição enviará a consulta.
cato_api_url = "https://api.catonetworks.com/api/v1/graphql2"
Nota
Nota: Uma API GraphQL usa apenas um URL para todas as chamadas de API. Os detalhes da chamada, como argumentos, são fornecidos no documento JSON. Isso contrasta com uma API REST que usaria um URL diferente para cada chamada de API e passaria argumentos para a chamada anexando-os ao URL. Esse uso de apenas um URL que não está cheio de argumentos é considerado outra vantagem de uma API GraphQL.
Em seguida, um dicionário é criado para definir dois cabeçalhos HTTP. Esses cabeçalhos são usados pelo objeto de requisição para construir uma requisição HTTP POST que o servidor GraphQL aceitará. Sem esses cabeçalhos, as requisições HTTP POST seriam rejeitadas pelo servidor.
headers = {'x-api-key': cato_api_key, 'Content-Type':'application/json'}
A próxima linha de código cria um objeto de contexto SSL. O Python usa esse objeto para determinar como ele deve criptografar as requisições HTTP e enviá-las usando Segurança a Nível de Transporte (TLS). Aqui estamos criando um objeto de contexto SSL que não verifica certificados. Isso foi feito para evitar erros de certificado em redes sujeitas à inspeção TLS upstream.
unverified_ctx = ssl._create_unverified_context()
Nota
IMPORTANTE! Usar um objeto de contexto SSL não verificado significa que nenhuma verificação será feita para garantir que os certificados são válidos. Cato Networks recomenda que você nunca use tal abordagem em produção. Os detalhes de como reforçar a segurança estão fora do escopo deste documento.
As próximas duas linhas de código convertem o dicionário Python que contém a chamada API Cato em uma string e codificam essa string em bytes. O segundo passo é necessário para permitir que a string seja transmitida pela rede.
json_post = json.dumps(graphql_query) json_post_encoded = json_post.encode()
Finalmente, o objeto de requisição é criado e o programa está agora pronto para enviar a chamada get_total_admins
ao servidor.
request = urllib.request.Request(url=cato_api_url, data=json_post_encoded, headers=headers)
Aqui, o programa envia a requisição para o servidor GraphQL chamando a função urlopen
da biblioteca urllib. Chamar esta função resultará no retorno de um objeto HTTPResponse.
response = urllib.request.urlopen(request, context=unverified_ctx, timeout=30)
Nota
AVISO! Chamar a função urlopen
pode resultar na geração de um erro. Por exemplo, o servidor GraphQL pode rejeitar a solicitação devido a um erro de sintaxe ou problemas de rede podem resultar em um tempo limite (ou seja, sem resposta após 30 segundos). Esses erros não são tratados aqui.
O objeto retornado pela função urlopen
inclui um campo body que contém o documento JSON retornado pelo servidor. Isso pode ser extraído do objeto executando seu método read
, que retorna um objeto de bytes. Este objeto de bytes é então convertido em um objeto de string chamando o método decode do objeto de bytes.
json_response_encoded = response.read() json_response = json_response_encoded.decode()
Esta string decodificada contém um documento JSON que se parecerá com isso:
{ "dados" : { "admins" : { "total": 4 } } }
Como você verá, o formato dos dados retornados se parece muito com o formato da solicitação enviada ao servidor. Isso é intencional e outra vantagem de usar a especificação GraphQL para implementar uma API. Essa abordagem simplifica a codificação da aplicação mantendo os dados retornados no mesmo formato da solicitação.
A linha final de código nesta seção do programa utiliza a função 'loads' da biblioteca json
para converter a string JSON retornada em um dicionário aninhado do Python.
get_total_admin_result = json.loads(json_response)
As duas últimas linhas do código extraem o valor do campo total
que foi retornado pelo servidor e o imprimem no console.
total = get_total_admins_result['data']['get_total_admins']['total'] print('O número total de admins definidos para sua conta é: {}'.format(total))
A saída será assim:
O número total de admins definidos para sua conta é: 4
O objetivo deste documento foi mostrar ao leitor como é fácil usar a API Cato. Detalhes exaustivos sobre a API Cato não foram incluídos e nenhum código foi escrito para lidar com erros. Em vez disso, um programa simples em Python foi usado para destacar os elementos mais importantes de uma aplicação da API Cato. Estes são:
-
Criando uma chamada API Cato e adicionando-a a um documento JSON
-
Obtendo a chave API Cato
-
Criando cabeçalhos HTTP que contêm a chave API Cato e definem o formato dos dados (JSON) dos dados enviados
-
Enviando o documento JSON (codificado em bytes) para o servidor API Cato GraphQL usando o comando HTTP POST criptografado com TLS
-
Convertendo o objeto de resposta retornado pelo servidor em um documento JSON
-
Convertendo o documento JSON em um formato que pode ser usado pelo programa
0 comentário
Artigo fechado para comentários.