【问题标题】:Paging through Foursquare API results with limit/offset to build a table使用限制/偏移对 Foursquare API 结果进行分页以构建表
【发布时间】:2012-09-17 20:33:22
【问题描述】:

我正在尝试使用 PHP 构建一个非常基本的网页,该网页在 html 表中显示 Foursquare 用户的 800 多个提示以及他们的保存和喜欢计数,用于报告和分析目的。这是我在foursquare上的意思的一个例子:http://foursquare.com/redbull/list/tips。 (再一次,redbull 只是我的例子。我正在与一个拥有 812 个提示的组织合作)。

Foursquare 提供了一个 api 来获取这些数据:

https://api.foursquare.com/v2/lists/{USER-ID}/tips?oauth_token={oauth-token}&limit=200&v=20120917

但是您一次只能获得 200 个结果,并且必须使用偏移量才能获得下一个 200、400 等等:

https://api.foursquare.com/v2/lists/{USER-ID}/tips?oauth_token={oauth-token}&limit=200&offset=200&v=20120917

在我的情况下,我需要调用 API 5 次才能获得所有 812 提示。我想出了一个非常笨重且不可扩展的解决方案,我确实多次调用 API 并继续在我的表中创建行。这是我丑陋但有效的解决方案:http://pastebin.com/WL6kdTPY

但显然,随着提示的不断增加,我需要不断修改我的代码,以应对 200 次以上的每次迭代。在 API 数据中,我可以看到总提示 (812) 的提及,所以我觉得我应该能够使用它来提出更精简的解决方案。

有人可以帮忙吗? 谢谢!

【问题讨论】:

    标签: php json api foursquare offset


    【解决方案1】:

    第二个循环应该可以解决问题:

    <?php 
    
    
    $today = date("Ymd");
    $likes = 0;
    $todo = 0;
    
    $offset = 0;
    $limit = 200;
    do{
        $url="https://api.foursquare.com/v2/lists/{user-id}/tips?oauth_token={oauth_token}&limit=".$limit."&offset=".$offset."&v={$today}";
        $source = file_get_contents($url);
        $obj = json_decode($source, true);
        foreach($obj['response']['list']['listItems']['items'] as $item)
        {
    
            echo "<tr>";
            echo "<td  style = 'width: 75px;'>" .  date('m/d/y', $item['createdAt']) . "</td>" ;
            echo "<td  style = 'width: 200px;'>" . $item['venue']['name'] . "</td>" ;    
            echo "<td  style = 'width: 400px;'>" . $item['tip']['text'] . "</td>" ;
            echo "<td  style = 'width: 50px; text-align: center;'>" . $item['tip']['likes']['count'] . "</td>" ;
            echo "<td  style = 'width: 50px; text-align: center;'>" . $item['tip']['todo']['count'] . "</td>" ;
            echo "</tr>";
            $likes += $item['tip']['likes']['count'];
            $todo += $item['tip']['todo']['count'];
    
        }
        $offset += $limit;
    } while(count($obj['response']['list']['listItems']['items']) >= $limit);
    
    
    ?>
    

    基本上你检查返回项目的数量是否低于每个请求的限制。那应该意味着你走到了尽头

    【讨论】:

    • hmm.. 在 $offset = 0 之后添加分号并将我的用户 ID 和令牌替换回 url 后,我只能从您的代码中获得前 200 个结果。感谢您的帮助。
    • 抱歉我的条件写得有点快,我需要计算 $obj['response']['list']['listItems']['items'] 而不是 $item :/
    猜你喜欢
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多