Объяснение Python скрипта для API Cato

Эта статья представляет API Cato и анализирует пример приложения на Python.

Введение

API Cato реализуется в соответствии с спецификацией GraphQL. Хотя GraphQL предназначен для создания простых в использовании API, изучение использования любой новой технологии все еще требует временных затрат от разработчика. Цель данного документа - уменьшить уровень этих затрат и пролить свет на небольшой Python приложение, которое выполняет вызов API Cato admins и просто возвращает количество административных учетных записей, определенных для учетной записи. Таким образом, читателю представлены наиболее важные элементы приложения API Cato GraphQL.

Примечание

Примечания:

Ожидается, что читатель обладает базовыми знаниями по следующим вопросам:

  • Скрипты или программирование (например, вы знакомы с такими понятиями, как переменные и библиотека кода)

  • Спецификация JSON (например, вы работали с JSON-документами)

  • Сетевое оборудование (например, вы знаете о существовании протокола HTTP и что такое сервер)

Некоторый опыт работы с языком Python будет полезен, но понимание статьи возможно и без него.

Обзор базового приложения API Cato

Представленное здесь приложение написано на Python и использует вызов Cato API admins для получения общего числа административных учетных записей, определенных для учетной записи.  Python и вызов API admins были выбраны, потому что:

  • Python - это очень распространенный язык, который легко читать и понимать

  • Вызов API admins может быть использован для создания очень простого примера вызова GraphQL API Cato

Пример программы является основным и не содержит проверки ошибок.  Программа делает не более, чем выводит общее количество определенных для аккаунта административных учетных записей. 

Примечание

Примечание: Cato API не привязан к любому конкретному языку программирования.  Возможно реализовать Приложение с Использованием любого Языка, способного использовать функцию HTTP POST и обрабатывать JSON-документы.  

Обзор Пример Программы

Этот пример программы короткий и не включает никакой логики принятия решений или кода для повторения действий.  Его можно было сделать еще короче, объединив несколько строк кода в одну.  Дополнительные строки кода добавлены для упрощения объяснения происходящего.

# Importировать библиотечный код Python
import os
import urllib.request
import ssl
import json

# Получить Ключ API Cato из переменной окружения
cato_api_key = os.getenv("CATO_API_KEY")

# Создать GraphQL запрос для отправки
get_total_admins = '''{
    admins (accountID: 12345) {
        total        
    }
}'''
graphql_query = {'query': get_total_admins}

# Создать 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)

# Отправить запрос и преобразовать ответ в словарь 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)

# Извлечь общее количество из возвращенных данных и вывести его
общий = get_admins_total_result['data']['admins']['total']
print('Общее количество административных учетных записей, определенных для вашего аккаунта: {}'.format(общий))

Примечание

ВАЖНО! Эта программа предоставляется в качестве демонстрации того, как получить доступ к API Cato с помощью Python. Это неофициальный выпуск Cato и он предоставляется без гарантий поддержки. Обработка ошибок ограничена минимально необходимым для работы скрипта с API и может быть недостаточной для производственных сред.

Все вопросы или отзывы должны быть отправлены на api@catonetworks.com

Диаграмма, представленная ниже, показывает последовательность событий, происходящих при запуске программы:

  1. Программа создает JSON-документ, который отправляется на сервер Cato API GraphQL.

  2. Сервер Cato API GraphQL проверяет, чтобы убедиться, что вызов API, определенный в JSON-документе, правильный и извлекает запрошенные данные из службы Cato.

  3. Сервер Cato API GraphQL возвращает данные в программу в файле JSON.

Cato_API_FLow.jpeg

Импорт библиотечного кода Python

Одной из причин использования Python для программного примера является наличие богатого набора библиотек.  Эти библиотеки предоставляют функции и объекты, которые могут обрабатывать широкий спектр задач.  Теперь мы рассмотрим каждую импортированную библиотеку и предоставим заметки, чтобы объяснить, почему она необходима.

import os
  • Библиотека os предоставляет функцию, которая позволяет коду получать доступ к данным, содержащимся в переменных окружения операционной системы.

import urllib.request
  • Модуль request из библиотеки urllib определяет класс Request, который создает объекты, способные обрабатывать взаимодействие с удаленными серверами, доступными через URL.

  • This will make it possible to send the Cato API request to the Cato GraphQL API server

import ssl
  • Библиотека ssl требуется для создания пользовательского контекста без проверки для запросов, отправляемых на сервер Cato GraphQL API.

import json
  • Эта библиотека содержит функции, которые позволяют преобразовывать словарь Python в строку JSON и обратно.

  • Эта возможность преобразования между двумя разными форматами значительно упрощает написание кода, который может работать с документами JSON.

Получение Ключ API Cato

Эта строка кода использует функцию библиотеки getenv для чтения ключа API из переменной окружения и присвоения его переменной.

cato_api_key = os.getenv("CATO_API_KEY")

The Cato GraphQL server expects to receive this key in a nHTTP header.  Ключ не предоставляется в документе JSON, так как спецификация GraphQL не включает авторизацию как часть стандарта.  Включение авторизации в документ JSON было бы нарушением спецификации.  Ключ API Cato генерируется через Приложение Управления Cato.  Для получения дополнительной информации о создании ключа API, см. Генерация API-ключей для API Cato.

Примечание

ВНИМАНИЕ! Хотя можно жестко закодировать ключ API Cato в коде, настоятельно рекомендуется этого не делать.

Создание запроса GraphQL для отправки

Следующие строки кода создают директорию Python, содержащую одну пару ключ/значение.  Значение записи формируется с использованием многострочной строки Python, определяющей запрос, который будет отправлен на сервер GraphQL.

get_total_admins = '''{
    admins (accountID: 12345) {
        total    
    }
}'''
graphql_query = {'query': get_total_admins}

Сервер Cato GraphQL интерпретирует эту строку следующим образом: выполните функцию get_total_admins, передавая ей два аргумента (accountID и тип) и возвращая только число сущностей "всего".  Или, выражаясь более прямо, "Верните общее количество сущностей администраторов, определенных для учетного примера # 12345".  This specific example of the admins API call  illustrates an important advantage of a GraphQL API

  • The server only returns the data that the application requested

Фактически, вызов admins может вернуть гораздо больше данных.  Например, приложение может запросить у admins вернуть детали о каждом администраторе.  Однако этому приложению необходимо лишь знать общее количество администраторов.  Эта характеристика GraphQL позволяет избежать так называемого избыточного извлечения и может значительно упростить код, необходимый для реализации приложения.

Создание HTTP-запроса

В этой части программы создается объект запроса.  Этот объект будет использоваться для отправки вызова API на сервер GraphQL с использованием HTTPS. Этот объект запроса требует информации, предоставляемой несколькими другими объектами, которые нужно сначала создать.   Прежде всего, создается простой объект строки для содержания URL GraphQL-сервера, которому объект запроса будет отправлять запрос.

cato_api_url = "https://api.catonetworks.com/api/v1/graphql2"

Примечание

Примечание: API GraphQL использует только один URL для всех вызовов API.  Детали вызова, такие как аргументы, предоставляются в документе JSON.  Это отличается от REST API, который будет использовать различный URL для каждого вызова API и передавать аргументы в вызов, добавляя их в URL.  Это использование всего одного URL, который не засорен аргументами, считается еще одним преимуществом GraphQL API. 

Далее создается словарь, который определяет два HTTP заголовка.  Эти заголовки используются объектом запроса для построения HTTP POST запроса, который сервер GraphQL примет.  Без этих заголовков сервер отклонил бы HTTP POST запросы.

headers = {'x-api-key': cato_api_key, 
 'Content-Type':'application/json'}

Следующая строка кода создает объект контекста SSL. Python использует этот объект, чтобы определить, как шифровать HTTP запросы и отправлять их с использованием Транспорт {Слоя Безопасности (TLS)}. Здесь мы создаем объект контекста SSL, который не проверяет сертификаты. Это сделано для избежания ошибок сертификата в сетях, подверженных инспекции TLS.

unverified_ctx = ssl._create_unverified_context()

Примечание

ВАЖНО! Использование непроверенного объекта контекста SSL означает отсутствие проверок для удостоверения, что сертификаты действительны. Cato Networks рекомендует никогда не использовать подобный подход в производственной среде. Подробности о том, как усилить безопасность, выходят за рамки данного документа.

Следующие две строки кода преобразуют словарь Python, содержащий вызов Cato API, в строку и кодируют эту строку в байты.  Второй шаг необходим, чтобы позволить передать строку по сети.

json_post = json.dumps(graphql_query)
json_post_encoded = json_post.encode()

Наконец, создается объект запроса, и программа готова отправить вызов get_total_admins на сервер.

request = urllib.request.Request(url=cato_api_url, data=json_post_encoded, headers=headers)

Отправка запроса и обработка ответа

В этом случае программа отправляет запрос на сервер GraphQL, вызывая функцию urlopen из библиотеки urllib.  Вызов этой функции приведет к возврату объекта HTTPResponse.  

response = urllib.request.urlopen(request, context=unverified_ctx, timeout=30)

Примечание

ПРЕДУПРЕЖДЕНИЕ! Вызов функции urlopen может привести к возникновению ошибки.  Например, сервер GraphQL может отклонить запрос из-за синтаксической ошибки, или сетевые проблемы могут привести к превышению времени ожидания (т.е. отсутствие ответа через 30 секунд).  Эти ошибки здесь не обрабатываются.

Объект, возвращаемый функцией urlopen, включает поле body, которое содержит JSON документ, возвращаемый сервером.  Это можно извлечь из объекта, вызвав его метод read, который возвращает объект байтов.  Этот объект байтов затем преобразуется в строковый объект путем вызова метода decode объекта байтов.

json_response_encoded = response.read()
json_response = json_response_encoded.decode()

Эта декодированная строка содержит JSON документ, который будет выглядеть следующим образом:

{
 "data" : {
 "admins" : {
 "total": 4
 }
 }
}

Как вы увидите, формат возвращенных данных очень похож на формат запроса, отправленного на сервер.  Это умышленное действие и еще одно преимущество использования спецификации GraphQL для реализации API.  Этот подход упрощает кодирование приложения, сохраняя возвращенные данные в такой же форме, как и запрос.

Последняя строка кода в этой секции программы использует функцию библиотеки json 'loads' для преобразования возвращенной строки JSON в вложенный словарь Python.  

get_total_admin_result = json.loads(json_response)

Извлечение общего количества из возвращенных данных и его вывод

Последние две строки кода извлекают значение из поля total, возвращенного сервером, и выводят его на консоль. 

total = get_total_admins_result['data']['get_total_admins']['total']
print('Общее количество администраторов, определенных для вашего аккаунта: {}'.format(total)) 

Вывод будет выглядеть так:

Общее количество администраторов, определенных для вашего аккаунта: 4

Сводка

Цель данного документа — показать читателю, насколько легко использовать API Cato.  Исчерпывающие детали о Cato API не включены, и код для обработки ошибок не написан.  Вместо этого простая Python программа была использована для выделения наиболее важных элементов приложения Cato API.  Это включает:

  • Создание вызова API Cato и добавление его в JSON документ

  • Получение ключа API Cato

  • Создание HTTP заголовков, содержащих ключ API Cato и определяющих формат данных (JSON) отправляемых данных

  • Отправка документа JSON (закодированного в байтах) на сервер Cato GraphQl API с использованием команды HTTP POST, зашифрованной с помощью TLS

  • Преобразование объекта Ответа, возвращенного сервером, в документ JSON

  • Преобразование документа JSON в формат, который может быть использован программой

Была ли эта статья полезной?

Пользователи, считающие этот материал полезным: 5 из 5

0 комментариев