使用PHP合并ClinicalTrials API多页返回的StudyFields JSON数据
ClinicalTrials API 批量请求并合并JSON数据解决方案
核心思路
先调用API获取总记录数,再按单次1000条的上限,循环调整min_rnk和max_rnk参数发起请求,每次将返回的StudyFields数组合并到主数组中,最终生成包含全量数据的单个StudyFieldsResponse结构JSON。
完整PHP代码示例
<?php // API基础配置 $apiUrl = "https://clinicaltrials.gov/api/v2/studies"; $fields = "NCTId,Condition,BriefTitle"; // 按需调整需要获取的字段 $batchSize = 1000; // 初始化合并后的主数据结构 $mergedResponse = [ "StudyFieldsResponse" => [ "StudyFields" => [], "TotalStudies" => 0, "MinRank" => 1, "MaxRank" => 0 ] ]; // 第一步:获取总记录数 $firstRequestUrl = sprintf( "%s?fields=%s&min_rnk=1&max_rnk=1", $apiUrl, urlencode($fields) ); $firstResponse = file_get_contents($firstRequestUrl); $firstData = json_decode($firstResponse, true); if (!isset($firstData['StudyFieldsResponse']['TotalStudies'])) { die("无法获取总记录数"); } $totalStudies = $firstData['StudyFieldsResponse']['TotalStudies']; $mergedResponse['StudyFieldsResponse']['TotalStudies'] = $totalStudies; // 第二步:循环请求并合并数据 $totalPages = ceil($totalStudies / $batchSize); for ($page = 1; $page <= $totalPages; $page++) { $minRnk = ($page - 1) * $batchSize + 1; $maxRnk = min($page * $batchSize, $totalStudies); $requestUrl = sprintf( "%s?fields=%s&min_rnk=%d&max_rnk=%d", $apiUrl, urlencode($fields), $minRnk, $maxRnk ); $response = file_get_contents($requestUrl); $data = json_decode($response, true); if (isset($data['StudyFieldsResponse']['StudyFields']) && is_array($data['StudyFieldsResponse']['StudyFields'])) { $mergedResponse['StudyFieldsResponse']['StudyFields'] = array_merge( $mergedResponse['StudyFieldsResponse']['StudyFields'], $data['StudyFieldsResponse']['StudyFields'] ); } // 模拟延迟,避免触发API频率限制 sleep(1); } // 更新最大排名 $mergedResponse['StudyFieldsResponse']['MaxRank'] = $totalStudies; // 输出合并后的JSON header('Content-Type: application/json'); echo json_encode($mergedResponse, JSON_PRETTY_PRINT); ?>
关键说明
- 总记录数获取:先请求1条数据拿到
TotalStudies,确定循环次数 - 分页参数计算:每次循环计算当前页的
min_rnk和max_rnk,最后一页直接用总记录数作为max_rnk,避免超出范围 - 数据合并:用
array_merge将每次返回的StudyFields数组追加到主数组 - 频率控制:加入
sleep(1)避免短时间请求过多触发API限制,可根据实际情况调整 - 结果输出:最终JSON仅含一个
StudyFieldsResponse节点,StudyFields数组包含全量记录
内容的提问来源于stack exchange,提问作者Samara Galvão
相关产品推荐
相关产品推荐

