【问题标题】:Want to write a for loop that calls an API with some conditions (if/else)想写一个 for 循环,在某些条件下调用 API(if/else)
【发布时间】:2020-12-08 11:53:32
【问题描述】:

我想调用一个提供我所有商店订单的 API。我总共有 86.000 个订单,其中第一个订单的 ID 是 2,最近一个订单的 ID 是 250.000。由于某些我还不知道的原因,订单显然不是连续计数的,但没关系。

我使用 for 循环开始了一个简单的脚本,其中 ID 在每个循环中都会更新,如下所示:

library(jsonlite)
library(httr)

user = "my_name"
token = "xyz"

y = 0
urls = rep("api.com/orders/", 250000)

for(i in urls){

y = y + 1

url = paste0(i, y)

a = httr::GET(url, authenticate(user, token))
a_content = httr:content(a, as = "text", encoding = "UTF-8")
a_json = jsonlite::fromJSON(a_content, flatten = T)
...
}

这里的问题是,只要有一个没有顺序的 ID,循环就会以 "{\"success\":false,\"message\":\"Order by id 1 not found\"}" 停止所以我不得不用一些 if else 语句扩展代码,比如“如果 id 与订单不匹配,请继续执行”下一个订单”。我也想将所有订单写入一个新列表。 任何帮助appriched。

【问题讨论】:

  • 你不能从a_content中提取"success"的值,然后检查是真还是假?

标签: r json api for-loop if-statement


【解决方案1】:

也许tryCatch 可以解决问题。这个url_exists function posted by user @hrbrmstr 在下面的循环中被调用。
如果没有测试,我会做一些类似的事情:

base_url <- "api.com/orders/"
last_order_number <- 250000

for(i in seq.int(last_order_number)){

  url = paste0(base_url, i)
  if(url_exists(url)){
    a <- httr::GET(url, authenticate(user, token))
    a_content <- httr:content(a, as = "text", encoding = "UTF-8")
    a_json <- jsonlite::fromJSON(a_content, flatten = T)
  }

}

【讨论】:

  • 这种方法的问题是url_exists() 会为我的所有网址提供FALSE,因为我的网址首先需要身份验证才能接受请求。
  • @lucaskr 您可以调整该功能以接受身份验证功能。
猜你喜欢
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2019-12-04
  • 2021-09-16
相关资源
最近更新 更多