-1

我是 API 世界的新手,需要获取我们所有用户的列表(总共 400 个)。最初我只能获得 30 个用户,但在阅读 API 说明后,我发现 30 是默认值。我将页面值设置为 100,这是最大值,我可以在我的数据网格中显示 100 个用户。但是,我想获得所有 400 个用户。据我了解,我需要设置分页来获取其他 300 个,但不知道如何实现这一点。如果有人可以查看我的代码并提供建议,我将不胜感激。下面的代码返回一个联系人列表,我将其显示在一个 winforms 数据网格中。

public static async Task<List<Contact>> LoadContacts(string filter)
    {
        string apiPath = ApiHelper.ApiClient.BaseAddress.ToString();
        switch (filter)
        {
            case "Deleted":
                apiPath += "?state=deleted;per_page=100";
                break;
            default:
                apiPath += "?per_page=100";
                break;
        }

        using (HttpResponseMessage response = await ApiHelper.ApiClient.GetAsync(apiPath))
        {
            Console.WriteLine("Response StatusCode: " + (int)response.StatusCode);

            if (response.IsSuccessStatusCode)
            {
                List<Contact> emp = await response.Content.ReadAsAsync<List<Contact>>();

                return emp;

            }
            else
            {
                throw new Exception(response.ReasonPhrase);
            }
        }
    }
4

1 回答 1

2

从文档看来,响应将包含一个标题为“链接”的标题,其中将包含带有下一组数据的 URL……如果未设置标题,则意味着没有更多记录。

如果存在,响应中的“链接”标头将保存下一页 url。如果您已到达对象的最后一页,则不会设置链接标题。

标题:“链接”:< https://domain.freshdesk.com/api/v2/tickets?filter=all_tickets&page=2 >;rel="next"

一个简单的递归函数将完成这项工作......见下文。

    public void GetAllContacts()
    {
        List<YourModel> listOfContacts = new List<YourModel();
        string startingUrl = "https://domain.freshdesk.com/api/v2/contacts?per_page=10";

        void GetNext(string url)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            using (Stream stream = response.GetResponseStream())
            using (StreamReader reader = new StreamReader(stream))
            {
                //reader.ReadToEnd(); // deserialize to model
                // listOfContacts.Add(<deserialized model>);

                if (response.Headers["link"] != null) // Check if the header is set on the Response
                    GetNext(response.Headers["link"]); // Header was set, recursive call to the link from the header
            }
        }


        GetNext(startingUrl);

        return listOfContacts;

    }
于 2020-01-13T22:39:43.753 回答