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

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

Введение

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

Примечание

Примечания:

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

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

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

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

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

Обзор простого приложения Cato API

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

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

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

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

Примечание

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

Обзор примерной программы

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

# Импортировать код библиотеки 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)

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

Примечание

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

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

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

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

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

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

Cato_API_FLow.jpeg

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

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

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

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

  • Это сделает возможным отправлять запросы Cato API на сервер Cato GraphQL API

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

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

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

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

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

cato_api_key = os.getenv("CATO_API_KEY")

Сервер Cato GraphQL ожидает получения этого ключа в HTTP-заголовке.  Ключ не предоставляется в документе JSON, поскольку спецификация GraphQL не включает авторизацию как часть стандарта.  Включение авторизации в документ JSON было бы нарушением спецификации.  API-ключ Cato генерируется через Приложение Управления Cato.  Для получения дополнительной информации о создании ключа API см. Создание API ключей для Cato API.

Примечание

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

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

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

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

Сервер Cato GraphQL интерпретирует эту строку как выполнение функции get_total_admins с двумя аргументами (accountID и type) и возврат только "общее" количество сущностей.  Или, говоря более прямо, "Вернуть общее количество сущностей администраторов, определенных для примера аккаунта # 12345".  Этот конкретный пример вызова API admins иллюстрирует важное преимущество API GraphQL

  • Сервер возвращает только те данные, которые запросило приложение

По сути, вызов 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 без аргументов считается еще одним преимуществом API GraphQL. 

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

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

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

unverified_ctx = ssl._create_unverified_context()

Примечание

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

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

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 была использована для выделения самых важных элементов приложения API Cato.  Они следующие:

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

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

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

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

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

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

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

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

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