
本文介绍如何通过递归方式优雅处理带分页链接(nexthref)的 restful api 响应,避免循环嵌套与重复代码,提升可读性、健壮性和内存管理能力。
本文介绍如何通过递归方式优雅处理带分页链接(nexthref)的 restful api 响应,避免循环嵌套与重复代码,提升可读性、健壮性和内存管理能力。
在调用支持分页的 REST API(如电商商品列表、用户记录等)时,常见响应结构中包含 meta.nextHref 字段,指向下一页数据的 URL。若使用 while 循环反复初始化 cURL 句柄并手动拼接结果,不仅逻辑冗余、易出错,还难以统一错误处理和资源释放。
更推荐采用递归函数设计:将 URL 作为参数传入,每次请求后检查是否存在 nextHref,存在则递归调用自身,并用 array_merge() 合并结果。这种方式语义清晰、符合函数式思维,且天然支持深度优先的数据聚合。
以下是优化后的完整实现:
function get_data($url) {
// 初始化 cURL
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, 0);
// 设置请求头(注意:$token 需在函数作用域外定义或通过闭包/依赖注入传入)
$headers = [
"accept: application/json;charset=utf-8",
"Authorization: Bearer {$token}",
"Content-Type: application/json-patch+json"
];
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
// 执行请求
$resp = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
// 基础错误处理
if ($resp === false || $httpCode !== 200) {
throw new RuntimeException("HTTP {$httpCode}: Failed to fetch data from {$url}");
}
$res = json_decode($resp, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException("Invalid JSON response from {$url}");
}
// 当前页数据存入数组
$array = [$res];
// 递归获取下一页(若存在)
if (isset($res['meta']['nextHref']) && !empty($res['meta']['nextHref'])) {
$array = array_merge($array, get_data($res['meta']['nextHref']));
}
return $array;
}
⚠️ 关键注意事项:
-
防止无限递归:务必校验
nextHref是否为空或无效 URL,建议增加最大递归深度限制(如添加$depth参数,默认上限 10 层); -
Token 作用域:示例中
$token应通过函数参数、全局常量或依赖注入方式传递,避免硬编码或超范围引用; - 性能考量:高频递归可能触发 PHP 栈溢出(默认约 100 层),生产环境建议结合尾递归优化或改用迭代 + 栈模拟;
- 错误统一处理:实际项目中建议封装 cURL 封装器,统一处理超时、重试、日志与异常;
- 内存优化:若数据量极大,可考虑流式处理(如逐页写入文件或数据库),而非全部加载至内存。
该方案将“请求→解析→判断→递归”逻辑内聚于单个函数,显著提升可维护性与测试友好性,是处理分页 API 的推荐实践。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











