R语言循环调用API报错:length(url) == 1 is not TRUE 求助
解决R循环调用API时的
parse_url(url)报错问题 问题描述
循环调用API时触发报错:Error in parse_url(url) : length(url) == 1 is not TRUE,单独传单个ID能正常获取数据,但循环中环境面板显示call_prospeststatus是拼接后的多值URL,而非单个请求地址。
核心原因
你的循环逻辑存在两个关键问题:
length(Prospect_IDs_DF)取的是数据框的列数,而非ID的实际数量;如果Prospect_IDs_DF是单列数据框,循环会提前终止或索引错误;如果是多列,Prospect_IDs_DF[[i]]会直接拿到整列数据,导致paste0生成多个URL,传给GET时因url长度大于1触发报错。- 状态码判断用了字符串
'200',但GET返回的status_code是数值型,会导致判断失效。
修正方案
1. 先提取ID向量
先从数据框中提取单独的ID向量,确保循环时每次拿到单个ID:
# 替换成你数据框中存储ID的列名,比如"prospect_id" prospect_ids <- Prospect_IDs_DF$prospect_id
如果不确定列名,用str(Prospect_IDs_DF)查看数据框结构,确认ID所在列。
2. 修改循环逻辑
基于ID向量的长度循环,同时修正状态码判断:
# get the 1st page (seed) call_prospeststatus <- paste0(base, endpoint, "/", "21894", "/prospectstatus") get_prospectstatus <- GET(call_prospeststatus, add_headers("Bb-Api-Subscription-Key" = subscription_key, "Authorization" = paste0("Bearer ", access_token))) get_prospectstatus_text <- content(get_prospectstatus, "text") get_prospectstatus_json <- fromJSON(get_prospectstatus_text, flatten = TRUE) get_prospectstatus_df <- as.data.frame(get_prospectstatus_json) # get the rest for(i in seq_along(prospect_ids)){ # 用向量索引拿到单个ID,拼接成唯一URL call_prospeststatus <- paste0(base, endpoint, "/", prospect_ids[i], "/prospectstatus") get_prospectstatus <- GET(call_prospeststatus, add_headers("Bb-Api-Subscription-Key" = subscription_key, "Authorization" = paste0("Bearer ", access_token))) get_prospectstatus_text <- content(get_prospectstatus, "text") get_prospectstatus_json <- fromJSON(get_prospectstatus_text, flatten = TRUE) # 状态码用数值型200判断 if (get_prospectstatus$status_code == 200){ get_prospectstatus_df_2 <- as.data.frame(get_prospectstatus_json) } else { get_prospectstatus_df_2 <- get_prospectstatus_df[FALSE,] } get_prospectstatus_df <- bind_rows(get_prospectstatus_df, get_prospectstatus_df_2) }
3. 进阶优化(可选)
- 添加错误捕获:避免单个API调用失败导致整个循环中断
for(i in seq_along(prospect_ids)){ tryCatch({ call_prospeststatus <- paste0(base, endpoint, "/", prospect_ids[i], "/prospectstatus") get_prospectstatus <- GET(call_prospeststatus, add_headers("Bb-Api-Subscription-Key" = subscription_key, "Authorization" = paste0("Bearer ", access_token))) if (get_prospectstatus$status_code == 200){ get_prospectstatus_text <- content(get_prospectstatus, "text") get_prospectstatus_json <- fromJSON(get_prospectstatus_text, flatten = TRUE) get_prospectstatus_df_2 <- as.data.frame(get_prospectstatus_json) } else { get_prospectstatus_df_2 <- get_prospectstatus_df[FALSE,] } get_prospectstatus_df <- bind_rows(get_prospectstatus_df, get_prospectstatus_df_2) }, error = function(e){ message(paste("处理ID", prospect_ids[i], "时出错:", e$message)) get_prospectstatus_df <- bind_rows(get_prospectstatus_df, get_prospectstatus_df[FALSE,]) }) }
- 提升循环效率:用列表存储结果,最后一次性合并,避免频繁绑定数据框
# 初始化结果列表,存入初始数据 result_list <- list(get_prospectstatus_df) for(i in seq_along(prospect_ids)){ tryCatch({ call_prospeststatus <- paste0(base, endpoint, "/", prospect_ids[i], "/prospectstatus") get_prospectstatus <- GET(call_prospeststatus, add_headers("Bb-Api-Subscription-Key" = subscription_key, "Authorization" = paste0("Bearer ", access_token))) if (get_prospectstatus$status_code == 200){ get_prospectstatus_text <- content(get_prospectstatus, "text") get_prospectstatus_json <- fromJSON(get_prospectstatus_text, flatten = TRUE) result_list[[i+1]] <- as.data.frame(get_prospectstatus_json) } else { result_list[[i+1]] <- get_prospectstatus_df[FALSE,] } }, error = function(e){ message(paste("处理ID", prospect_ids[i], "时出错:", e$message)) result_list[[i+1]] <- get_prospectstatus_df[FALSE,] }) } # 最后合并所有结果 get_prospectstatus_df <- bind_rows(result_list)
内容的提问来源于stack exchange,提问作者JayRH
相关产品推荐
相关产品推荐

