如何使用PHP通过Toggl API加载明细报表的全部数据?
如何使用MorningTrain/toggl-api获取Toggl Detail Report的全部数据?
问题描述
我在为客户开发的应用中使用PHP调用Toggl API,需要通过Detail Report加载客户、项目、用户、任务、开始时间、结束时间等全部数据。目前仅能加载50行数据,无法获取所有可用数据。我使用的是GitHub上的MorningTrain/toggl-api工具,当前代码如下:
require 'vendor/autoload.php'; $report = new MorningTrain\TogglApi\TogglReportsApi('my_api_token'); $workspaceId = work_space_id; $data = $report->getDetailsReport(array('user_agent'=>'test_apps', 'workspace_id'=> $workspaceId));
解决方案
这个问题很常见——Toggl的Detail Report API默认采用分页机制,每页只返回50条数据,这就是你只能拿到部分数据的原因。要获取全部数据,我们需要通过分页遍历的方式,一页一页请求直到所有数据都被获取。
修改后的代码
require 'vendor/autoload.php'; $report = new MorningTrain\TogglApi\TogglReportsApi('my_api_token'); $workspaceId = work_space_id; // 替换为你的实际工作区ID $allReportData = []; $currentPage = 1; $perPage = 200; // Toggl API允许的最大每页条数,减少请求次数 do { // 请求当前页的详情报告数据 $pageData = $report->getDetailsReport([ 'user_agent' => 'test_apps', 'workspace_id' => $workspaceId, 'page' => $currentPage, 'per_page' => $perPage ]); // 合并当前页数据到总数据集 if (!empty($pageData)) { $allReportData = array_merge($allReportData, $pageData); $currentPage++; } else { // 无更多数据,终止循环 break; } // 如果当前页数据量小于每页上限,说明已到最后一页 if (count($pageData) < $perPage) { break; } // 可选:添加短暂延迟避免触发API限流 // sleep(1); } while (true); // $allReportData 现在包含所有的详情报告数据 // 可以根据需求处理这些数据,比如存入数据库或返回给前端 print_r($allReportData);
关键说明
- 分页参数:通过添加
page(当前页码)和per_page(每页条数)参数,实现分页请求。Toggl API允许per_page最大设为200,这样能减少总请求次数,提升效率。 - 循环终止条件:当某一页返回空数据,或者返回的数据条数小于
per_page时,说明已经获取完所有数据,终止循环。 - API限流注意:如果你的数据量极大,建议在每次请求之间加入短暂延迟(比如
sleep(1)),避免触发Toggl的API请求频率限制。
内容的提问来源于stack exchange,提问作者Shimul
相关产品推荐
相关产品推荐

