[英]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.