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

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,而非单个请求地址。

核心原因

你的循环逻辑存在两个关键问题:

  1. length(Prospect_IDs_DF)取的是数据框的列数,而非ID的实际数量;如果Prospect_IDs_DF是单列数据框,循环会提前终止或索引错误;如果是多列,Prospect_IDs_DF[[i]]会直接拿到整列数据,导致paste0生成多个URL,传给GET时因url长度大于1触发报错。
  2. 状态码判断用了字符串'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. 进阶优化(可选)

  1. 添加错误捕获:避免单个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,])
    })
}
  1. 提升循环效率:用列表存储结果,最后一次性合并,避免频繁绑定数据框
# 初始化结果列表,存入初始数据
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:12:41