【发布时间】: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.character。context()函数需要一个 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 <- GET(...),则可以使用httr::content(tmp, as = "text")获取内容。我强烈建议您避免使用assign(),它是对应的小写字母get()。这确实是您的问题所在。
标签: r jira jira-rest-api httr