【问题标题】:Get all users from API [closed]从 API 获取所有用户 [关闭]
【发布时间】:2020-01-13 21:49:31
【问题描述】:

我是 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);
            }
        }
    }

【问题讨论】:

  • 您使用的是哪个 API?任何默认值都将特定于该特定 API 的实现,限制和任何其他操作参数也是如此。如果不了解 API 的详细信息,就不可能知道如何操作 API,而且很可能它是您的应用程序特有的东西,因此您也必须共享该代码。在此过程中,您应该自己寻找这些细节。在此过程中,您或许可以回答自己的问题。
  • 好吧,一方面,您使用分号 (;) 分隔参数,而文档显示与号 (&amp;),这对于查询字符串是正常的。
  • 我一直在阅读文档,并通过我自己的研究得到了这个结果。第 9 节说,要滚动页面,请将页面参数添加到 url。页码从 1 开始并且不应超过 10 - 这是否意味着我必须设置一个循环并不断请求页面,直到没有更多页面?
  • 根据文档,这似乎是您必须要做的。页面大小上限为 100,页码上限为 10,将您的 10 个请求的总数限制为 1000 个。

标签: c# freshdesk


【解决方案1】:

从文档看来,响应将包含一个标题为“链接”的标头,其中将包含带有下一组数据的 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;

    }

【讨论】:

  • 非常感谢Adriani6! :O)
猜你喜欢
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
相关资源
最近更新 更多