Cet article introduit l'API Cato et analyse une application Python d'exemple.
L'API Cato est implémentée conformément à la spécification GraphQL. Bien que GraphQL soit destiné à produire des API faciles à utiliser, apprendre à utiliser toute nouvelle technologie nécessite encore un investissement de temps de la part du développeur. Le but de ce document est de réduire le niveau de cet investissement et guide à travers une petite application Python qui exécute l'appel API Cato admins et retourne simplement le nombre d'administrateurs définis pour un compte. Ce faisant, les éléments les plus importants d'une application API Cato GraphQL sont présentés au lecteur.
Note
Notes :
Il est attendu que le lecteur ait une compréhension de base des éléments suivants :
-
Scripting ou programmation (par exemple, vous êtes familier avec des concepts comme les variables et les bibliothèques de code)
-
La spécification JSON (par exemple, vous avez travaillé avec des documents JSON)
-
Mise en réseau (par exemple, vous connaissez l'existence du protocole HTTP et ce qu'est un serveur)
Une certaine expérience avec le langage Python serait bénéfique, mais l'article devrait toujours être compréhensible sans cela.
L'application présentée ici a été écrite en Python et utilise l'appel API Cato admins pour récupérer le nombre total d'administrateurs définis pour un compte. Python et l'appel API admins ont été choisis parce que :
-
Python est un langage très courant qui est facile à lire et à comprendre
-
L'appel API
adminspeut être utilisé pour créer un exemple très simple d'appel de l'API Cato GraphQL
Le programme d'exemple est basique et contient aucun contrôle d'erreur. Le programme ne fait pas plus qu'imprimer le nombre total d'administrateurs définis pour le compte.
Note
Note : L'API Cato n'est liée à aucun langage de programmation spécifique. Il est possible de mettre en œuvre une application utilisant n'importe quel langage qui peut utiliser la fonction HTTP POST et traiter des documents JSON.
Ce programme d'exemple est court et n'inclut aucune logique de prise de décision ou de code pour répéter les actions. Il aurait pu être encore plus court en combinant certaines des lignes de code en une seule ligne. Les lignes de code supplémentaires ont été incluses pour faciliter l'explication de ce qui se passe.
# Importer le code de la bibliothèque Python
import os
import urllib.request
import ssl
import json
# Obtenir la clé API Cato d'une variable d'environnement
cato_api_key = os.getenv("CATO_API_KEY")
# Créer la requête GraphQL à envoyer
get_total_admins = '''{
admins (accountID: 12345) {
total
}
}'''
graphql_query = {'query': get_total_admins}
# Construire la requête 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)
# Envoyer la requête et convertir la réponse en un dictionnaire 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)
# Extraire le total des données retournées et l'imprimer
total = get_admins_total_result['data']['admins']['total']
print('Le nombre total d'administrateurs défini pour votre compte est : {}'.format(total))
Note
IMPORTANT ! Ce programme est fourni à titre de démonstration sur la façon d'accéder à l'API Cato avec Python. Il ne s'agit pas d'une version officielle de Cato et est fourni sans garantie de support. La gestion des erreurs est limitée au strict minimum requis pour que le script fonctionne avec l'API, et peut ne pas être suffisante pour les environnements de production.
Toutes les questions ou commentaires doivent être envoyés à api@catonetworks.com
Le schéma fourni ci-dessous montre la séquence d'événements qui se produisent lorsque le programme est exécuté :
-
Le programme crée un document JSON qui est envoyé au serveur GraphQL de l'API Cato.
-
Le serveur GraphQL de l'API Cato vérifie que l'appel API défini dans le document JSON est correct et obtient les données demandées du service Cato.
-
Le serveur GraphQL de l'API Cato renvoie les données au programme dans un fichier JSON.
L'une des raisons pour lesquelles Python est utilisé pour le programme d'exemple est la disponibilité d'un ensemble riche de bibliothèques. Ces bibliothèques fournissent des fonctions et des objets capables de gérer un large éventail de tâches. Nous allons maintenant passer en revue chaque bibliothèque importée et fournir des notes pour expliquer pourquoi elle est nécessaire.
import os
-
La bibliothèque os fournit une fonction qui permettra au code d'accéder aux données contenues dans les variables d'environnement du système d'exploitation.
import urllib.request
-
Le module
requestde la bibliothèqueurllibdéfinit la classe Request qui crée des objets capables de gérer la communication avec les serveurs distants accessibles via une URL. -
Cela permettra d'envoyer la requête API Cato au serveur API GraphQL Cato
import ssl
-
La bibliothèque ssl est requise pour créer un contexte non vérifié personnalisé pour les requêtes envoyées au serveur API GraphQL de Cato.
import json
-
Cette bibliothèque contient des fonctions qui permettront de convertir un dictionnaire Python en chaîne JSON et vice versa.
-
Cette capacité de conversion entre les deux formats différents facilite grandement l'écriture de code pouvant travailler avec des documents JSON.
Cette ligne de code utilise la fonction de bibliothèque getenv pour lire la clé API à partir d'une variable d'environnement et l'assigner à une variable.
cato_api_key = os.getenv("CATO_API_KEY")
Le serveur GraphQL de Cato s'attend à recevoir cette clé dans un en-tête HTTP. La clé n'est pas fournie dans le document JSON car la spécification GraphQL n'inclut pas l'autorisation dans la norme. Inclure l'autorisation dans le document JSON serait une violation de la spécification. La clé API Cato est générée via l'application de gestion Cato. Pour plus d'informations sur la création d'une clé API, voir Génération de clés API pour l'API Cato.
Note
AVERTISSEMENT ! Bien qu'il soit possible de coder en dur la clé API Cato dans votre code, il est fortement recommandé de ne pas le faire.
Les deux prochaines lignes de code créent un répertoire Python contenant une paire clé/valeur. La valeur de l'entrée est construite à l'aide d'une chaîne multi-lignes Python qui définit la requête qui sera envoyée au serveur GraphQL.
get_total_admins = '''{
admins (accountID: 12345) {
total
}
}'''
graphql_query = {'query': get_total_admins}
Le serveur GraphQL de Cato interprétera cette chaîne comme signifiant : exécuter la fonction get_total_admins, en lui passant deux arguments (accountID et type) et en retournant uniquement le nombre "total" d'entités. Ou dit plus directement, "Retourner le nombre total d'entités d'administrateurs qui sont définies pour le compte d'exemple # 12345". Cet exemple spécifique de l'appel API admins illustre un avantage important d'une API GraphQL
-
Le serveur ne renvoie que les données que l'application a demandées
En fait, l'appel admins peut renvoyer beaucoup plus de données. Par exemple, il est possible pour une application de demander à admins de retourner des détails sur chaque administrateur. Cependant, cette application a seulement besoin de connaître le nombre total d'administrateurs. Cette caractéristique de GraphQL évite ce qu'on appelle le sur-collecte et peut grandement simplifier le code nécessaire pour mettre en œuvre l'application.
Dans cette section du programme, un objet de requête est construit. Cet objet sera utilisé pour envoyer l'appel API au serveur GraphQL en utilisant HTTPS. Cet objet de requête nécessite des informations fournies par plusieurs autres objets qui doivent être créés en premier. Tout d'abord, un objet chaîne simple est construit pour contenir l'URL du serveur GraphQL que l'objet de requête enverra la requête à.
cato_api_url = "https://api.catonetworks.com/api/v1/graphql2"
Note
Note : Une API GraphQL utilise une seule URL pour tous les appels API. Les détails de l'appel, comme les arguments, sont fournis dans le document JSON. Ceci est en contraste avec une API REST qui utiliserait une URL différente pour chaque appel API et passerait les arguments à l'appel en les ajoutant à l'URL. Cette utilisation d'une seule URL non encombrée d'arguments est considérée comme un autre avantage d'une API GraphQL.
Ensuite, un dictionnaire est créé qui définit deux en-têtes HTTP. Ces en-têtes sont utilisés par l'objet de requête pour construire une requête HTTP POST que le serveur GraphQL acceptera. Sans ces en-têtes, les requêtes HTTP POST seraient rejetées par le serveur.
headers = {'x-api-key': cato_api_key,
'Content-Type':'application/json'}
La prochaine ligne de code crée un objet de contexte SSL. Python utilise cet objet pour déterminer comment il doit crypter les requêtes HTTP et les envoyer en utilisant la sécurité au niveau du transport (TLS). Ici, nous créons un objet de contexte SSL qui ne vérifie pas les certificats. Cela a été fait pour éviter les erreurs de certificats dans les réseaux soumis à une inspection TLS en amont.
unverified_ctx = ssl._create_unverified_context()
Note
IMPORTANT ! L'utilisation d'un objet de contexte SSL non vérifié signifie qu'aucune vérification ne sera faite pour s'assurer que les certificats sont valides. Cato Networks recommande de ne jamais utiliser une telle approche en production. Les détails sur la façon de renforcer la sécurité sont au-delà de la portée de ce document.
Les deux lignes de code suivantes convertissent le dictionnaire Python contenant l'appel API Cato en une chaîne et codent cette chaîne en octets. La deuxième étape est nécessaire pour permettre la transmission de la chaîne sur le réseau.
json_post = json.dumps(graphql_query) json_post_encoded = json_post.encode()
Enfin, l'objet de requête est créé et le programme est maintenant prêt à envoyer l'appel get_total_admins au serveur.
request = urllib.request.Request(url=cato_api_url, data=json_post_encoded, headers=headers)
Ici, le programme envoie la requête au serveur GraphQL en appelant la fonction urlopen de la bibliothèque urllib. Appeler cette fonction résultera en le retour d'un objet HTTPResponse.
response = urllib.request.urlopen(request, context=unverified_ctx, timeout=30)
Note
AVERTISSEMENT ! Appeler la fonction urlopen pourrait entraîner la génération d'une erreur. Par exemple, le serveur GraphQL pourrait rejeter la requête en raison d'une erreur de syntaxe ou les problèmes de réseau pourraient entraîner un délai d'attente (c'est-à-dire pas de réponse après 30 secondes). Ces erreurs ne sont pas gérées ici.
L'objet retourné par la fonction urlopen inclut un champ de corps qui contient le document JSON retourné par le serveur. Cela peut être extrait de l'objet en exécutant sa méthode read qui retourne un objet bytes. Cet objet bytes est ensuite converti en un objet chaîne en appelant la méthode decode de l'objet bytes.
json_response_encoded = response.read() json_response = json_response_encoded.decode()
Cette chaîne décodée contient un document JSON qui ressemblera à ceci :
{
"data" : {
"admins" : {
"total": 4
}
}
}
Comme vous le verrez, le format des données retournées ressemble beaucoup au format de la requête envoyée au serveur. C'est intentionnel et constitue un autre avantage de l'utilisation de la spécification GraphQL pour implémenter une API. Cette approche simplifie le codage de l'application en conservant les données retournées dans le même format que la requête.
La dernière ligne de code dans cette section du programme utilise la fonction de bibliothèque json 'loads' pour convertir le texte JSON retourné en un dictionnaire imbriqué Python.
get_total_admin_result = json.loads(json_response)
Les deux dernières lignes du code extraient la valeur du champ total qui a été retourné par le serveur et l'impriment sur la console.
total = get_total_admins_result['data']['get_total_admins']['total']
print('Le nombre total d'admins défini pour votre compte est : {}'.format(total))
La sortie ressemblera à ceci :
Le nombre total d'admins défini pour votre compte est : 4
L'objectif de ce document était d'illustrer au lecteur à quel point il est simple d'utiliser l'API Cato. Des détails exhaustifs sur l'API Cato n'ont pas été inclus et aucun code n'a été écrit pour gérer les erreurs. À la place, un simple programme Python a été utilisé pour mettre en évidence les éléments les plus importants d'une application API Cato. Ceux-ci sont :
-
Créer un appel API Cato et l'ajouter à un document JSON
-
Obtenir la clé API Cato
-
Créer des en-têtes HTTP contenant la clé API Cato et définissant le format des données (JSON) des données envoyées
-
Envoyer le document JSON (encodé en octets) au serveur Cato GraphQl API en utilisant la commande HTTP POST chiffrée avec TLS
-
Convertir l'objet réponse retourné par le serveur en un document JSON
-
Convertir le document JSON dans un format utilisable par le programme
0 commentaire
Cet article n'accepte pas de commentaires.