PHP API请求:基于Cursor实现分页数据循环获取并写入文件的代码求助
解决Cursor分页循环获取所有数据的PHP实现方案
嘿,作为API新手能写出第一页的请求已经很棒啦!接下来咱们把循环逻辑、错误处理和数据收集的部分补上,让代码能自动获取所有分页数据并写入文件。
核心思路
- 初始化变量存储所有收集到的数据
- 循环发送请求:只要返回的
pageInfo.hasMore为true,就用返回的cursor作为下一次请求的参数 - 每次请求后解析响应,将数据追加到总数据集合中
- 加入错误处理,避免请求失败或无效响应导致程序崩溃
- 最后将所有数据统一写入文件(也可选择每次请求后追加写入)
完整代码实现
<?php // 基础配置 $baseUrl = "myURL/incoming/v2/content"; $outputFile = 'CURL-CONTENT.txt'; $allData = []; $nextCursor = null; $hasMore = true; // 请求头(生产环境建议用环境变量存储密钥,不要硬编码) $headers = [ "Accept: application/json", "Authorization: Bearer key", ]; while ($hasMore) { // 构建请求URL:首次请求不带cursor,后续请求拼接cursor参数 $url = $baseUrl; if ($nextCursor !== null) { $url .= "?cursor=" . urlencode($nextCursor); } // 初始化CURL $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); // 注意:仅测试环境关闭SSL验证,生产环境必须删除以下两行! curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 执行请求并处理CURL错误 $resp = curl_exec($curl); if ($resp === false) { echo "CURL请求失败: " . curl_error($curl) . "\n"; curl_close($curl); break; } // 解析JSON响应并处理解析错误 $responseData = json_decode($resp, true); if (json_last_error() !== JSON_ERROR_NONE) { echo "JSON解析错误: " . json_last_error_msg() . "\n"; curl_close($curl); break; } // 收集数据(需根据API实际返回的结果字段调整,示例假设数据在'data'键下) if (isset($responseData['data'])) { $allData = array_merge($allData, $responseData['data']); } else { echo "响应中未找到预期的结果字段,请检查API返回结构\n"; curl_close($curl); break; } // 更新分页状态 if (isset($responseData['pageInfo'])) { $hasMore = $responseData['pageInfo']['hasMore']; $nextCursor = $responseData['pageInfo']['cursor'] ?? null; } else { echo "响应中未找到分页信息'pageInfo',停止循环\n"; $hasMore = false; } curl_close($curl); // 可选:添加请求延迟,避免触发API限流(根据API文档调整时长) usleep(500000); // 暂停0.5秒 } // 将所有数据格式化为美观的JSON写入文件 file_put_contents($outputFile, json_encode($allData, JSON_PRETTY_PRINT)); echo "所有数据已成功写入文件: " . $outputFile . "\n"; ?>
关键部分说明
- 循环控制:通过
while($hasMore)实现循环,每次请求后根据API返回的pageInfo.hasMore更新循环状态 - URL编码:用
urlencode()处理cursor参数,避免特殊字符导致的URL无效问题 - 错误处理:
- 捕获CURL请求失败的错误信息
- 校验JSON解析结果,防止无效响应破坏后续逻辑
- 检查响应中是否包含预期的
data和pageInfo字段,适配API返回结构
- 数据收集:用
array_merge()将每一页的数据合并到总数组中,保证数据完整性 - 限流防护:添加
usleep()延迟,避免短时间内高频请求触发API限流机制 - 文件写入:最终将所有数据格式化为可读性强的JSON写入文件,若需保留原始响应格式,可改为每次请求后用
FILE_APPEND参数追加写入
生产环境注意事项
- SSL验证:务必删除关闭SSL验证的两行代码,开启SSL验证保障请求安全
- 密钥安全:不要硬编码
Bearer key,建议通过环境变量(如getenv('API_AUTH_TOKEN'))获取 - 内存优化:若数据量极大,可改为每次请求后直接追加写入文件,减少内存占用
内容的提问来源于stack exchange,提问作者Mark H
相关产品推荐
相关产品推荐

