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

使用变量作为请求对象时httr::content抛出is.response(x) is not true错误

问题分析与解决方案

你遇到的is.response(x) is not true错误根源非常清晰:你传给httr::content()的不是httr的响应对象,而是用户ID的字符串tmp_var,这完全不符合函数的参数要求!

为什么会出错?

你用assign()创建了query_abc123这类真实的响应对象,但后续却拿着用户ID字符串去调用content()——这就好比你递快递单号给快递员要取件,而不是递实际的快递箱子,肯定拿不到东西。


修正方案1:修复原循环逻辑

直接在循环中先存储响应对象,再传给content(),同时优化JQL的写法(给用户ID加单引号,避免特殊字符导致语法错误):

org_list <- as.data.frame(read.csv("org_list.csv"))

for (i in 1:nrow(org_list)) {
  # 提取当前用户ID,确保是字符串类型
  user_id <- as.character(org_list[i, "ID"])
  
  # 先发送请求,将响应存到临时变量中
  current_response <- GET(
    "https://myjira.com/",
    path = "rest/api/2/search",
    query = list(
      jql = paste0("project in (ABC,DEF,XYZ) AND reporter = '", user_id, "'"),
      maxResults = 500
    ),
    authenticate(my_UN, my_PW)
    # verbose() 可暂时注释,避免循环输出过多日志
  )
  
  # 直接用响应对象调用content,这才是正确的用法
  api_request_content <- httr::content(current_response, as = "text")
  api_request_content_flat <- fromJSON(api_request_content, flatten = TRUE)
  
  # 存储结果到指定变量
  assign(paste0("data_", user_id), as.data.frame(api_request_content_flat$issues))
  
  # 清理临时响应对象
  rm(current_response)
}

修正方案2:更规范的列表存储方式(推荐)

创建1400个独立变量会严重污染全局环境,后续处理也很麻烦。用列表统一存储所有用户数据,不仅更整洁,还能添加错误处理:

org_list <- as.data.frame(read.csv("org_list.csv"))
# 初始化空列表存储所有用户的工单数据
all_user_tickets <- list()

for (i in 1:nrow(org_list)) {
  user_id <- as.character(org_list[i, "ID"])
  
  current_response <- GET(
    "https://myjira.com/",
    path = "rest/api/2/search",
    query = list(
      jql = paste0("project in (ABC,DEF,XYZ) AND reporter = '", user_id, "'"),
      maxResults = 500
    ),
    authenticate(my_UN, my_PW)
  )
  
  # 先检查请求是否成功,避免失败响应导致后续报错
  if (httr::http_status(current_response)$category == "Success") {
    api_request_content <- httr::content(current_response, as = "text")
    api_request_content_flat <- fromJSON(api_request_content, flatten = TRUE)
    all_user_tickets[[user_id]] <- as.data.frame(api_request_content_flat$issues)
  } else {
    warning(paste("获取用户", user_id, "工单失败,状态码:", current_response$status_code))
    all_user_tickets[[user_id]] <- NULL
  }
}

# 可选:将所有用户数据合并为一个大的DataFrame
combined_tickets <- do.call(rbind, all_user_tickets)

核心总结

httr::content()的参数必须是GET()/POST()返回的响应对象本身,而不是对象的名字字符串。只要你直接使用请求返回的响应变量,就能解决这个错误。

内容的提问来源于stack exchange,提问作者Alex Dometrius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:37:49