【问题标题】:httr::content throws error when supplying a variable as the request objecthttr::content 在提供变量作为请求对象时抛出错误
【发布时间】:2019-01-10 04:29:37
【问题描述】:

我正在尝试获取组织内任何人打开的 Jira 票证列表。我有一个用户 ID 列表,但该组织中有近 1400 人。

由于有这么多人,我不能简单地在 1 个请求中查询所有这些人,因此我创建了一个循环来执行此操作。循环的 GET 请求部分工作正常,我得到每个 ID 的响应(无论该用户是否实际创建了任何 Jira 票证)。我遇到的问题是尝试提取这些响应的内容, httr::content 抛出错误 is.response(x) is not true 。这似乎是由于我将列表作为 x 传递给“内容”,尽管我也尝试了其他一些选项但没有成功。

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

csv文件是这样的(但有1378个ID):

ID 
abc123 
xyz987 

这是循环:

for (i in 1:1378) {

assign(paste0("query_", org_list[i,]), GET("https://myjira.com/", 
                   path = "rest/api/2/search", 
                   query = list(jql = paste0("project in (ABC,DEF,XYZ) AND reporter = ", org_list[i,]), maxResults = 500),
                   authenticate(my_UN, my_PW),
                   verbose()
) 
)

  tmp_var <-  as.character(org_list[i,])
  api_request_content <- httr::content(tmp_var, as = "text")
  api_request_content_flat <- fromJSON(api_request_content, flatten = TRUE)
  assign(paste0("data_", tmp_var), as.data.frame(api_request_content_flat$issues))
  rm(paste0("query_", tmp_var))

}

这会创建一个响应对象,例如“query_abc123”、“query_xyz987”等。如果我删除了“assign”函数之外的所有内容,则循环本身可以正常工作。

我也试过了:

api_request_content <- httr::content(org_list[i,], as = "text")

api_request_content <- httr::content(paste0(org_list[i,]), as = "text")

它们都返回相同的错误。 但是,如果我像

这样手动传递对象
api_request_content <- httr::content(query_abc123, as = "text")

一切都按预期进行。谷歌搜索的一个下午没有为我返回任何接近答案的东西。

【问题讨论】:

  • 不要在org_list[i,] 上使用as.charactercontext() 函数需要一个 httr 响应对象,而不是字符值。试试httr::content(org_list[i,], as = "text")
  • 其实等等,这里的assign()有什么用。这似乎把事情搞砸了,因为你正在创建疯狂的变量名。您确定需要这样做吗?
  • @MrFlick,我已经尝试过您的建议,您可以在帖子底部看到
  • @MrFlick 最后我想要一份关于这些问题的报告。分配创建一个像“query_abc123”、“query_xyz987”等对象,然后它应该被展平为“data_”query_abc123和“data_query_xyz987”等。在这个循环运行后,我打算使用dplyr::bind_rows来构建包含所有数据的单个数据框
  • 那么您应该只使用lapply 来执行循环并创建一个列表。如果将GET() 的结果保存到变量中,例如tmp &lt;- GET(...),则可以使用httr::content(tmp, as = "text") 获取内容。我强烈建议您避免使用assign(),它是对应的小写字母get()。这确实是您的问题所在。

标签: r jira jira-rest-api httr


【解决方案1】:

如果没有适当的可重现示例,这都是一种猜测,但更常见的策略是这样的

alldata <- dplyr::bind_rows(lapply(as.character(org_list[[1]]), function(reporter) {

  req <- GET("https://myjira.com/", 
            path = "rest/api/2/search", 
            query = list(jql = paste0("project in (ABC,DEF,XYZ) AND reporter = ", reporter), maxResults = 500),
            authenticate(my_UN, my_PW),
            verbose()
  ) 

  api_request_content <- httr::content(req, as = "text")
  api_request_content_flat <- fromJSON(api_request_content, flatten = TRUE)
  as.data.frame(api_request_content_flat$issues)
}))

【讨论】:

  • 效果很好!谢谢!
  • 如果我想将 ID 列重新添加到这里怎么办?我尝试在 as.data.frame... 之后将以下内容添加到末尾:dplyr::mutate(api_request_content_flat, "Reporter" = report)。但我明白了:没有适用于“mutate_”的方法应用于“list”类的对象。我认为 mutate 可以很好地与 bind_rows 一起使用,但是将其发送到列表似乎并没有达到我的预期效果。
  • 你试过as.data.frame(api_request_content_flat$issues) %&gt;% mutate(Reporter=reporter)吗?您需要传入 data.frame,而不是展平列表。
  • whelp,我试过这样:api_request_content_flat
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
相关资源
最近更新 更多