httr :: content выдает ошибку при предоставлении переменной в качестве объекта запроса - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь получить список билетов Jira, которые были открыты кем-либо в организации. У меня есть список идентификаторов пользователей, но в этой организации около 1400 человек.

Поскольку таких людей очень много, я не могу просто запросить их все за 1 запрос, поэтому я создал цикл для этого. Часть цикла GET-запроса работает нормально, и я получаю ответ для каждого идентификатора (независимо от того, были ли какие-либо билеты Jira фактически созданы этим пользователем). Когда я сталкиваюсь с проблемой, пытаясь извлечь содержимое этих ответов, httr :: content выдает ошибку is.response(x) is not true. Похоже, это связано с тем, что я передал список как x в «content», хотя я пробовал и другие варианты, но безуспешно.

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

Где CSV-файл похож на это (но с 1378 идентификаторами):

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")

Все работает как задумано. День Гуглинга ничего не дал, даже близко к ответу для меня на этот счет.

1 Ответ

0 голосов
/ 09 января 2019

Без надлежащего воспроизводимого примера, это все виды догадок, но более распространенной стратегией было бы что-то вроде этого

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)
}))
...