我已经找了几个星期了,但没有找到任何可以帮助我解决这个特定问题的东西。
我从API调用(Meraki)中得到了大量输出,我正在寻找从列表中提取某些功能。
任务:从API调用中读取输出,循环遍历输出,直到检测到状态"failed",并打印该项目的接口和networkId,将networkId从预定义的列表中转换为网络名称,并继续打印所有"失败的接口"。直到输出结束
API调用获得整个组织,我想与网络名称(因为它们没有添加在相同的API调用中)匹配networkid的列表,所以它的可读网络具有哪个接口失败。
输出包含大量数据,我不需要所有这些输出值,如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())
另一个帖子给出的答案,@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",)
是我想要的。
根据您的示例输出,看起来您只在响应和接口中获得了一次网络ID,并且多次被视为上行链路属性的一部分。因此,您可以将API响应解析为Json对象,并在字典中拥有网络名称-网络ID映射,并执行以下操作以获得失败状态
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'])