如何用httr2的req_perform_iterative实现基于Next URL的API分页?
使用httr2的req_perform_iterative处理Next URL分页API(以Rick and Morty API为例)
Rick and Morty API采用Next URL分页机制:每一页响应的info字段中包含next字段,值为下一页的请求URL;当没有更多数据时,next会返回null。以下是完整的实现方案:
核心:编写next_req函数
next_req是req_perform_iterative的关键参数,它需要接收当前请求的响应,提取下一页URL并构建新的请求对象;如果没有下一页,则返回NULL终止迭代。
library(httr2) # 初始化初始请求 initial_req <- request("https://rickandmortyapi.com/api/character") # 定义next_req函数 next_req <- function(resp) { # 解析响应的JSON数据 resp_data <- resp_body_json(resp) # 提取下一页URL next_url <- resp_data$info$next if (!is.null(next_url)) { # 基于初始请求修改URL(复用请求配置,如headers) req_url(initial_req, next_url) } else { # 无下一页,返回NULL终止迭代 NULL } }
执行迭代请求
调用req_perform_iterative执行多页请求,可选设置max_iter避免无限循环:
# 执行迭代请求,最多获取10页数据 page_responses <- req_perform_iterative( req = initial_req, next_req = next_req, max_iter = 10 ) # 提取并合并所有页的角色数据 all_characters <- lapply(page_responses, function(page_resp) { resp_body_json(page_resp)$results }) all_characters <- do.call(c, all_characters)
关键说明
- 若目标API的下一页URL存储在响应的其他位置,只需修改
resp_data$info$next的路径即可适配 - 如果不需要复用初始请求的配置(如自定义headers),也可以直接用
request(next_url)创建新请求 max_iter参数建议必加,防止因API返回异常的next值导致无限迭代
内容的提问来源于stack exchange,提问作者pgrad
相关产品推荐
相关产品推荐

