【问题标题】:How to make concurrent HTTP requests with basic authentication如何使用基本身份验证发出并发 HTTP 请求
【发布时间】:2018-04-03 22:15:05
【问题描述】:

我的目标是从 Shopify 导入客户的订单历史记录。 Shopify 只允许我每个请求导入 250 个订单,但我的客户有数千个。

这是(基本上)我当前使用 httr 的工作解决方案,非常慢

fetchedList <- list()

# Loop through pages of orders and collect them
for(pg in 1:10){

  requestURL <- paste0("https://abc-store.myshopify.com/admin/orders.json?page=", p)

  fetched <- httr::GET(
    url = requestURL,
    httr::add_headers(Accept = "application/json"),
    httr::authenticate(user = "foo", password = "bar")
  )

  # Append the fetched response to fetchedList 
  fetchedList <- c(fetchedList, list(fetched))
}

# Process the results...

我想通过发出多个并发请求来加快速度。我怎样才能做到这一点? curlRCurl 似乎都支持这个,但我对 HTTP 还很陌生,无法让任何一个解决方案都能正常工作。

【问题讨论】:

    标签: r curl rcurl httr


    【解决方案1】:

    您应该使用 multi api 来执行并发请求。请参阅 ?multi_run 的手册页或小插图中有关 async requests 的部分。

    还有一些封装了 multi api 的包来尝试使它更容易。 crul package (注意 crul 不是拼写错误 :) 或更多,如果你想真正看中 async 包。

    【讨论】:

    • +1。此功能实际上在 crul 中尚不存在,但 it's coming(希望很快)。
    【解决方案2】:

    感谢@Jeroen 将我指向crul 包。当时, crul 实际上并没有设置这个功能,但是我和维护者交谈,他实现了它。所以,从 v 0.5.2.9100 开始,我可以做到

    dd <- Async$new(urls = c(
      'https://abc-store.myshopify.com/admin/orders.json?page=1',
      'https://abc-store.myshopify.com/admin/orders.json?page=2',
      'https://abc-store.myshopify.com/admin/orders.json?page=3'
    ))
    res <- dd$get(auth = auth(user = "foo", pwd = "bar"))
    vapply(res, function(z) z$status_code, double(1))
    vapply(res, function(z) z$success(), logical(1))
    lapply(res, function(z) z$parse("UTF-8"))
    

    【讨论】:

    • 感谢您发布此信息。很棒的问题。 crul 包中的小插曲基本上也很完美。
    猜你喜欢
    • 1970-01-01
    • 2015-10-07
    • 2014-08-14
    • 2011-01-09
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多