Вызов API Meraki get.organization/восходящие каналы находит неудачные подключения и преобразует идентификатор сети в сетевое имя

#python #json #meraki-api

Вопрос:

Я искал несколько недель и нигде не нашел ничего, что могло бы помочь мне с этой конкретной проблемой.

Я получил большой вывод из вызова API (Meraki), я хочу извлечь определенные функции из списка.

Задача: считайте выходные данные из вызова API, просматривайте выходные данные до тех пор, пока не будет обнаружен статус «сбой», и распечатайте интерфейс и идентификатор сети этого элемента, превратите идентификатор сети в сетевое имя из предопределенного списка и продолжайте печатать все «неудачные интерфейсы» до конца вывода.

Вызов API получает всю организацию, и я хочу сопоставить список сетевых идентификаторов с сетевыми именами (поскольку они не добавляются в один и тот же вызов API), чтобы было понятно, какая сеть имеет какой интерфейс, который вышел из строя.

Вывод содержит много данных , и мне не нужны все эти выходные значения, такие как IP, шлюз, DNS и т. Д.

пример вывода из вызова API:

 {'networkId': 'A_1234567890', 'serial': 'A1B2-C3D4-E5F6', 'model': 'MX64', 'lastReportedAt': '2021-01-01T10:00:00Z', 'uplinks': [{'interface': 'wan1', 'status': 'active', 'ip': '192.168.1.2', 'gateway': '192.168.1.1', 'publicIp': '192.168.1.3', 'primaryDns': '8.8.8.8', 'secondaryDns': '8.8.4.4', 'ipAssignedBy': 'static'}, {'interface': 'wan2', 'status': 'ready', 'ip': '172.16.1.2', 'gateway': '172.16.1.1', 'publicIp': '172.16.1.3', 'primaryDns': '8.8.8.8', 'secondaryDns': '8.8.4.4', 'ipAssignedBy': 'static'}]}  

Это одна сеть, в которой в этой организации насчитывается 50, статус которой я хочу проверить.

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

вызов API, который я использую: (нашел шаблон и при необходимости изменил его, чтобы получить полный список всех сетей в моей организации)

 import requests  url = "https://api.meraki.com/api/v1/organizations/{ORG_ID}/uplinks/statuses"  payload = None  headers = {  "Content-Type": "application/json",  "Accept": "application/json",  "X-Cisco-Meraki-API-Key": "API_KEY" }  response = requests.request('GET', url, headers=headers, data = payload)  pprint(response.json())  

Ответ №1:

Ответ дан в другом посте @ Szabolcs:

 net_names = {"A_1234567890": "Name"} for network_data in json_data:  network_id = network_data.get("networkId")  for uplink_data in network_data.get("uplinks", []):  if uplink_data["status"] == "failed":  print(  "network ID:",  network_id, ""  "Network:",  net_names.get(network_id, "n/a"),  "- Interface:",  uplink_data["interface"],  "- failed",)  

Делает все, что я хочу.

Ответ №2:

Основываясь на вашем примере вывода, похоже, что вы получили идентификатор сети только один раз в ответе и интерфейсе и много раз рассматривались как часть атрибута восходящей связи, следовательно, вы можете проанализировать ответ API как объект Json и сопоставить сетевые имена — идентификатор сети в словаре и сделать что-то вроде ниже, чтобы получить статус «сбой».

 net_names = {'A_1234567890':'abc', 'b':'xyz'} network_id =response_json.get('networkId') for item in response_json['uplinks']:  if item['status'] == "failed":  print('network ID:', network_id,'network_name:',net_names.get(network_id), 'Interface:',item['interface'])  

Комментарии:

1. Ошибка атрибута: объект «Ответ» не имеет атрибута «получить»

2. сначала вам нужно преобразовать ответ в JSON » response = json.loads(ответ)».

3. вызовите ошибку типа(если объект JSON должен быть str, байт или bytearray, ошибка типа: объект JSON должен быть str, байт или bytearray, а не ответ @Sid по-прежнему нет пирога.