将cURL命令转换为R GET请求

时间:2020-07-11 23:58:24

标签: r curl get httr rcurl

有人知道如何将更复杂的cURL命令转换为httr:GET()请求。我遇到的问题是,该API仅需要用户名形式的密钥,而不需要任何密码。

$ curl https://api.goclimate.com/v1/flight_footprint \
  -u YOUR_API_KEY: \
  -d 'segments[0][origin]=ARN' \
  -d 'segments[0][destination]=BCN' \
  -d 'segments[1][origin]=BCN' \
  -d 'segments[1][destination]=ARN' \
  -d 'cabin_class=economy' \
  -d 'currencies[]=SEK' \
  -d 'currencies[]=USD' \
  -G

也许像Rcurl这样的其他软件包可能更合适?

谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,当您在后面不带任何字符的情况下包括“:”时,您就是在将密码指定为空字符串。因此,使用httr就像

GET("https://api.goclimate.com/v1/flight_footprint",
    authenticate("YOUR_API_KEY",""),
    query=list(
        "segments[0][origin]"="ARN",
        "segments[0][destination]"="BCN",
        "segments[1][origin]"="BCN",
        "segments[1][destination]"="ARN",
        "cabin_class"="ecomony",
        "currencies[0]"="SEK",
        "currencies[1]"="USD"))

扩展参数的索引有点麻烦,您可以编写一个辅助函数

query_expand <- function(x) {
  expd <- function(name, value) {
    do.call("c", unname(Map(function(name, value) {
      if(is.list(value) && !is.null(names(value))) {
        xx <- expd(paste0("[", names(value), "]"), value)
        setNames(xx, paste0(name, names(xx)))
      } else if(is.list(value)) {
        xx <- expd(paste0("[",seq_along(value)-1,"]"), value)
        setNames(xx, paste0(name, names(xx)))
      } else if (length(value)>1) {
        setNames(as.list(value), paste0(name, "[", seq_along(value)-1,"]"))
      } else {
        setNames(list(value), name)
      }}, name, value)))
  }
  expd(names(x), x)
}

然后,如果您的数据几乎在一个对象中

params <- list("segments" = list(
    list(origin="ARN", destination="BCN"),
    list(origin="BCN", destination=c("ARN"))
  ),
  "cabin_class" = "ecomony",
  "currencies" = c("SEK","USD"))

您可以使用

GET("https://api.goclimate.com/v1/flight_footprint",
    authenticate("YOUR_API_KEY",""),
    query = query_expand(params))