如何返回所有页面而不是仅返回第一页

Posted

技术标签:

【中文标题】如何返回所有页面而不是仅返回第一页【英文标题】:How to return all pages instead of only 1st 【发布时间】:2016-03-26 11:53:07 【问题描述】:

我正在查询 URI 以从 Web 服务获取一些数据。没关系。 但我注意到我的 json hase page_count 有多个页面,但只返回第一页数据。

这是 json 的样子:


  "last_item": null,
  "total_items": "201",
  "first_item": null,
  "page_number": "1", **<-- THIS IS 1ST PAGE**
  "page_size": "10", 
  "page_items": null,
  "search_time": "0.045",
  "page_count": "21",  **<-- THERE IS 21 PAGES IN TOTAL**
  "cars": 
    "car": [
       ... ,
       ... ,
      ...
      ...
      ]
   

如何返回所有页而不是只返回第一页?我知道这可能不是一个好主意,但我该怎么做呢?

更新: Web 服务的 URI 类似于:

http://<api_address>.com/json/cars/search?app_key=<api_key>&c=music&location=32.263569,-111.9847682

谢谢,

【问题讨论】:

您能否提供更多关于您的查询方式的信息? @ebeeb 添加了更新部分。谢谢ebeeb 在不知道您所针对的 API 的情况下,很难猜测您将随请求发送哪些参数以调整结果。这个问题可能对***.com/questions/12168624/…有帮助。 请参阅 API 文档,如果这可能的话... 如果您提供站点名称或者您必须查看他们的文档,那就太好了。如果不查看适当的文档,有人如何回答您的问题。 【参考方案1】:

我看到您正在使用应用程序密钥。

所以我猜你正在使用的 API 以某种方式限制了查询量每个查询的数据量。

我可以想象您使用的查询总是只返回 一个 页的数据,以及可用的总页数,让您知道还有多少页可用。

我猜如果你不指定你希望查询默认返回第一页的页面。

更新

因此,如果您无法将每个查询的页面大小设置为大于 50,这是您(可能)无法更改的 API 端限制。

这意味着在客户端上您需要多次查询。有多种方法可以做到这一点,但你应该问问自己是否想要这个。

您真的需要一次触手可及的所有这些数据吗? 客户端带宽使用可能会急剧增加。 如果突然汽车数量如此之多以至于您的内存不足,会发生什么? 如果每个应用程序密钥的 API 查询在某种程度上受到数据量的限制,那么请求的数量(再次以各种方式,我不知道您使用的是什么 API)也会不必要地增加 API 上的工作量。

如果有的话,也许可以深入研究 API 的文档。可能还有其他查询完全符合您的要求,但可能尚未包含有关“汽车”的所有详细数据,而是包含一些元数据。

【讨论】:

正确,我使用 api-key 并且查询总是返回第一页。我知道我可以使用 page_size=50 设置每页的项目数(设置为每页 50 个项目),并且我知道如何移动到第 3 页(page_number=3)。但是我如何一次全部返回?谢谢ebeeb 我可以设置page_size,也可以设置page_number。因此,如果我将 page_size 设置为 10 并且结果总数为 23,我可以设置 page_number=1 来获得前 10 个结果,然后 page_number=2 来获得接下来的 10 个结果,而 page_number=3 来获得最后 3 个结果(因为 23 在全部的)。我也可以将 page_size 设置为 30 以获得所有 23 个结果,但我知道你在说什么,这不是一个好方法。所以,你是对的,我猜我应该发出多个请求来获取第一页 1,然后是第 2 页,最后是最后一页。我想这是做这种事情的正确方法? 这取决于 API。想象一下,如果你有 2300 辆汽车。您可以请求 page_number=1 和 page_size=1,因此您在第一次请求时只会收到非常少的数据。然后你会看到总共有 2300 页,在这种情况下等于 2300 辆汽车。现在您可以使用 page_number=1 和 page_size=2300 进行查询。 我明白了,比归还所有 2300 辆汽车更好,更好的方法是将 page_size 设置为 10(汽车),然后在第一页中,获取 page_count(在这种情况下为 23)然后循环 23 次以获得所有 23 页。这是正确的方法吗?也许也可以异步执行,以便数据一旦可用就开始显示? 正确的方法在很大程度上取决于您的需求。更具体地说,想象一下在手机上滚动浏览汽车,它可以同时显示 7 辆汽车,您可能希望以一次请求 20 辆汽车的方式实现它。一旦第 10 辆车进入视野,您就请求接下来的 20 辆车,以免用户等待。当请求和滚动正在进行时,执行此异步可防止所有内容冻结。保持请求的数据较小对于客户来说很重要,因为这样可以防止他们的电话帐单飞涨。

以上是关于如何返回所有页面而不是仅返回第一页的主要内容,如果未能解决你的问题,请参考以下文章

当当前页面不是第一页时,ViewPager在旋转屏幕后有错误的偏移数据

使用rowcallback时,数据表行索引无法正常工作

iframe跳转后再刷新又返回原页面了

如何获取下一页的页面源

Flutter页面状态在返回时不刷新

复选框(Icheck)限制不适用于数据表中的其他页面,仅适用于第一页