【问题标题】:paginated api request, how to know if there is another page?分页的api请求,如何知道是否还有另一个页面?
【发布时间】:2015-11-02 10:35:39
【问题描述】:

我正在创建一个使用 3rd 方 API 的 PHP 类。 API 有一个具有此请求 URL 结构的方法:

https://api.domain.com/path/sales?page=x

其中“x”是页码。

每页返回 50 个销售额,我需要为每个用户返回不确定数量的页面(取决于用户销售额)并存储每次销售的一些数据。

我已经创建了一些从 URL 获取数据、解码并使用所需数据创建新数组的方法,但仅限于第一个页面请求。

现在我想创建一个方法来检查是否有另一个页面,如果有,获取它并再次检查

如何检查是否还有其他页面?以及如何创建一个循环来获取另一个页面(如果有的话)?

我已经有了这段代码,但它会创建一个无限循环。

require('classes/class.example_api.php');
$my_class = new Example_API;
$page = 1;
$sales_url = $my_class->sales_url( $page );
$url = $my_class->get_data($sales_url);

while ( !empty($url) ) {
    $page++;
    $sales_url = $my_class->sales_url( $page );
    $url = $my_class->get_data($sales_url);
}

我不使用 CURL,我使用 file_get_content。当我请求超出范围的页面时,我得到以下结果:

string(2) "[]"

这是json_decode之后的另一个:

array(0) { }

【问题讨论】:

  • 输入超出范围的页面时api返回什么?
  • 假设您使用 CURL,当您尝试访问不存在的页码时,请求是否返回 200 以外的内容?
  • 谢谢!我编辑了问题以回答您的问题。

标签: php api pagination


【解决方案1】:

根据您的输入,在 while 循环中,您更改 $url(实际上保存 API 调用返回的数据)并检查是否为空,如果我是正确的。

$url = $my_class->get_data($sales_url);

如果以上只是原始响应(因此如果页面超出范围,字符串“[]”),它将永远不会将 empty("[]") 变为 true。所以我的猜测是 get_data 的返回值就是这个字符串,而它应该是实际的数组/json,即使结果是空的(即我怀疑你在收集数据后执行 json_decode,例如在循环之外)。

如果是这种情况,我的建议是在循环中检查“[]”(例如 while ($url !== "[]"))或在循环中解码响应数据($url = json_decode($url))。

【讨论】:

  • 谢谢!这就是问题所在,我刚刚将 json_decode 添加到响应中并且它可以工作。
【解决方案2】:

根据我使用多个 API 的经验,响应返回找到的行数,以及从第 1 页开始的每页 x 个数。 在您的情况下,如果响应具有行数,则只需将其除以 x 编号页,然后将结果作为页码循环。

$results = 1000;
$perPage = 50;
$pages = ceil($results/$perPage);
for (i=1; $i <= $pages; $i++){
     // execute your api call and store the results
}

希望对您有所帮助。

【讨论】:

  • 我想你的意思是for ($i=1 ; $i &lt; $pages; $i++){ 不?
【解决方案3】:

从您显示的响应中,如果没有结果,您会得到一个空数组。在这种情况下,您可以在循环中使用empty 方法来确定是否有任何要报告的内容:

// Craft the initial request URL
$page = 1;
$url = 'https://api.domain.com/path/sales?page=' . $page;

// Now start looping
while (!empty(file_get_contents($url)) {
    // There's data here, do something with it

    // And set the new URL for the next page
    $url = 'https://api.domain.com/path/sales?page=' . ++$page;
}

这样它将继续循环遍历所有页面,直到没有更多数据为止。

【讨论】:

    【解决方案4】:

    检查 http 响应标头以了解集合中的项目总数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 2015-11-18
      • 2021-12-11
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      相关资源
      最近更新 更多