簡體   English   中英

While循環進行API調用,直到滿足條件為止

[英]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循環似乎不起作用。 但是代碼編譯沒有任何錯誤。

  1. 如何將x的值設置為25並進行API調用並將結果附加到results直到more錯誤為假?

要么

  1. 在找到匹配項之前,如何進行多個API調用。 如果找到匹配項,請停止撥打電話。

還是有更好的清潔方法來做到這一點?

這是行不通的,因為一旦更改了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM