You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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";
?>

关键部分说明

  1. 循环控制:通过while($hasMore)实现循环,每次请求后根据API返回的pageInfo.hasMore更新循环状态
  2. URL编码:用urlencode()处理cursor参数,避免特殊字符导致的URL无效问题
  3. 错误处理:
    • 捕获CURL请求失败的错误信息
    • 校验JSON解析结果,防止无效响应破坏后续逻辑
    • 检查响应中是否包含预期的data和pageInfo字段,适配API返回结构
  4. 数据收集:用array_merge()将每一页的数据合并到总数组中,保证数据完整性
  5. 限流防护:添加usleep()延迟,避免短时间内高频请求触发API限流机制
  6. 文件写入:最终将所有数据格式化为可读性强的JSON写入文件,若需保留原始响应格式,可改为每次请求后用FILE_APPEND参数追加写入

生产环境注意事项

  • SSL验证:务必删除关闭SSL验证的两行代码,开启SSL验证保障请求安全
  • 密钥安全:不要硬编码Bearer key,建议通过环境变量(如getenv('API_AUTH_TOKEN'))获取
  • 内存优化:若数据量极大,可改为每次请求后直接追加写入文件,减少内存占用

内容的提问来源于stack exchange,提问作者Mark H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:08:14