执行一定的逻辑直到满足要求

Execute certain logic till it meets the requirement

我写了一个 C# 代码来从供应商 API 中提取数据,这里我可以在每个 API 请求中提取最多 100 条记录。如果 API 中有超过 100 条记录 present/returned 那么 API 将 return "paging" 信息以下一个 URL 的形式追加JSON 响应数据中的如下属性;

 ],
    "paging": {
        "next": {
            "after": "2459708154",
            "link": "https://api.someapi.com/objects?archived=false&limit=100&after=2459708154
        },
        "prev": null
    }

我在这里担心的是我想编写一个递归代码逻辑,它将检查 returned JSON 响应数据以及它是否包含响应中附加的 "paging" 属性然后它再次调用 API 直到到达最终请求调用,其中 "paging" 属性数据不会 appended/returned 在 JSON 响应中,否则它将为空。

目前我正在使用多个 If 语句来执行此操作,并且只提取数据直到 300-400 条记录,如下所示;

var recentDealsInfo = await _objReq.Post<Deals>(_limit, dtPastDay, isGetRecentAPI: true);
//store response in a list of deals
List<Deal> lstRecentDeals = recentDealsInfo.results;
//handle paging for more than 100 records
if (!string.IsNullOrEmpty(recentDealsInfo.paging.next.after))
{
    //build request url using paging information for next 100 records
    var nxtdeals = await _objReq.Post<Deals>(_limit, dtPastDay, nxtLink: recentDealsInfo.paging.next.after, isGetRecentAPI: true);
    //add records to the list
    lstRecentDeals.AddRange(nxtdeals.results);
    if (!string.IsNullOrEmpty(nxtdeals.paging.next.after))
    {
        //build request url using paging information for next 100 records
        var nextdeals = await _objReq.Post<Deals>(_limit, dtPastDay, nxtLink: nxtdeals.paging.next.after, isGetRecentAPI: true);
        //add records to the list
        lstRecentDeals.AddRange(nextdeals.results);
        if (!string.IsNullOrEmpty(nextdeals.paging.next.after))
        {
            //build request url using paging information for next 100 records
            var nextdeal = await _objReq.Post<Deals>(_limit, dtPastDay, nxtLink: nextdeals.paging.next.after, isGetRecentAPI: true);
            //add records to the list
            lstRecentDeals.AddRange(nextdeal.results);
        }
        // and so on ....
    }                    
}

感谢您的建议!

var recentDealsInfo = await _objReq.Post<Deals>(_limit, dtPastDay, isGetRecentAPI: true);

//store response in a list of deals
List<Deal> lstRecentDeals = recentDealsInfo.results;

var after = recentDealsInfo.paging.next.after;

//handle paging for more than 100 records
while (true)
{
    if (string.IsNullOrEmpty(after))
    {
        break;
    }
    
    //build request url using paging information for next 100 records
    var tmp = await _objReq.Post<Deals>(_limit, dtPastDay, nxtLink: after, isGetRecentAPI: true);
    lstRecentDeals.AddRange(tmp.results);
    
    after = tmp.paging.next.after;
}

使用 while 循环解决此问题可能如下所示

var response = await _objReq.Post<Deals>(_limit, dtPastDay, isGetRecentAPI: true);
List<Deal> recentDeals = response.results;
string nextPage = response.paging.next.after;

while (!string.IsNullOrEmpty(nextPage))
{
    response = await _objReq.Post<Deals>(_limit, dtPastDay, nxtLink: nextPage, isGetRecentAPI: true);
    recentDeals.AddRange(response.results);
    nextPage = response.paging.next.after;
}