[英]While loop to make API calls until a condition is met
我想进行API调用,直到满足条件为止。 我认为我可能会使用while循环。
我有来自分页服务器的JSON响应。
{
"services": [
{
"id": "ABC12",
"name": "Networks",
"description": null,
"status": "active",
"teams": [
{
"id": "XYZ12",
"type": "team_reference",
"summary": "Network Systems ",
}
],
"acknowledgement_timeout": null,
"auto_resolve_timeout": null,
"alert_grouping": "intelligent",
"alert_grouping_timeout": null,
"integrations": [],
"response_play": null,
"type": "service",
"summary": "All Events",
}
],
"limit": 25,
"offset": 0,
"total": null,
"more": true
}
limit - max I can set is 100.
offset - If specified, shows results from that point.
more - If TRUE, there are more results. If FALSE, that is the end.
有关此分页的更多信息-https: //v2.developer.pagerduty.com/docs/pagination
我需要匹配name
“ Networks”并获取其对应的id
“ ABC12”。 问题是,我必须分页对API进行多次调用。
到目前为止,我已经写过了。
import requests
import json
import urllib3
# Supress SSL warnings
urllib3.disable_warnings()
# API key
API_KEY = '12345asdfg'
def list_services():
x = 25
y = 0
results = []
url = f'https://api.pagerduty.com/services/?limit={x}&offset={y}'
headers = {
'Accept': 'application/vnd.pagerduty+json;version=2',
'Authorization': 'Token token={token}'.format(token=API_KEY)
}
current_page = json.loads(requests.get(url, verify=False, headers=headers).content.decode('UTF-8'))
results.append(current_page)
while current_page['more'] == 'True':
y = y + 1
current_page = json.loads(requests.get(url, verify=False, headers=headers).content.decode('UTF-8'))
results.append(current_page)
print(results) # Does not print anything
print(results) # Prints only the first call results, the while loop
# doesn't seem to work.
if __name__ == '__main__':
list_services()
while循环外的print(results)
仅打印第一个API调用结果。 while循环似乎不起作用。 但是代码编译没有任何错误。
x
的值设置为25
并进行API调用并将结果附加到results
直到more
错误为假? 要么
还是有更好的清洁方法来做到这一点?
这是行不通的,因为一旦更改了y,就永远不会真正重新分配url变量。 另外,您还要检查'True'
,它是一个字符串,而不是布尔值。 另外,我认为抵消量应该每次都增加结果量。 不只是一个 例如,如果在您的第一个电话中,您得到的结果是1-25。 然后,如果将y加1,则第二个调用将产生2-26。 相反,您应该将其增加限制。 这样,在第二次通话中,您将获得25-50的结果。 这是我的处理方式:
def list_services():
x = 25
y = 0
results = []
serv_id = None
flag = False
url = f'https://api.pagerduty.com/services/?limit={x}&offset={y}'
headers = {
'Accept': 'application/vnd.pagerduty+json;version=2',
'Authorization': 'Token token={token}'.format(token=API_KEY)
}
current_page = json.loads(requests.get(url, verify=False, headers=headers).content.decode('UTF-8'))
results.append(current_page)
for serv_set in current_page['services']:
if serv_set['name'] == 'Networks':
serv_id = serv_set['id']
flag = True
while current_page['more'] == True and not flag:
for serv_set in current_page['services']:
if serv_set['name'] == 'Networks':
serv_id = serv_set['id']
break
y += x
url = f'https://api.pagerduty.com/services/?limit={x}&offset={y}'
current_page = json.loads(requests.get(url, verify=False, headers=headers).content.decode('UTF-8'))
results.append(current_page)
print(results)
print(results, serv_id)
您可以进一步清理以避免某些冗余,但这应该可以工作。 您还应该检查API调用的状态,以确保获得有效的响应。
我编辑了当name == 'Networks'
时获取id属性的问题。 再一次,您可以大量减少冗余,但这将使您步入正轨。 现在serv_id =服务的ID,名称为Networks
。 如果在迭代结束时未找到匹配项,则serv_id将为None
。
while current_page['more'] == 'True':
您正在检查一个名为“ True”的字符串,而不是json文件中定义的True布尔值。 这可能就是为什么while循环永远不会执行,并且您没有收到打印语句的原因。
此外,通常对于具有多于一页数据的API调用,您需要指定要获取的页面。 这意味着您需要在while循环中重新初始化有效负载。
例如,如果一个API具有可以传递的名为“ page”的参数,则在while循环中,您必须传递page = 1,page = 2等,以作为有效载荷。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.