【问题标题】:R API Connection (Localytics) with getURL and RCurl Error带有 getURL 和 RCurl 错误的 R API 连接(Localytics)
【发布时间】:2023-05-25 07:56:01
【问题描述】:

我正在尝试通过他们的 API (https://api.localytics.com/docs#query) 从移动分析服务 Localytics 获取数据。特别是我想在 R 中翻译以下 cURL 命令:

curl --get  'https://api.localytics.com/v1/query' \
 --user 'API_KEY:API_SECRET' \
 --data 'app_id=APP_ID' \
 --data 'metrics=users' \
 --data 'dimensions=day' \
 --data-urlencode 'conditions={"day":["between","2013-04-01","2013-04-07"]}'

我的 R 代码现在看起来像这样。 APIKey 和 API secret 当然会被实际的密钥所取代。但是,我收到一条错误消息,指出必须至少指定一个维度或指标。

object <- getURL('https://api.localytics.com/v1/query', userpwd = "API_Key:API_Secret", httpheader=list(app_id = "app_id=03343434353534",
metrics = "metrics=users",
dimensions = "dimensions=day",
conditions = toJSON('conditions={"day":["between","2014-07-01","2014-07-10"]}')),  ssl.verifypeer = FALSE)

需要进行哪些更改才能使其正常工作。

提前感谢您帮助我, 彼得

【问题讨论】:

    标签: r api ssl parameters rcurl


    【解决方案1】:

    使用 httr 的开发版特别容易:

    library(httr)
    
    r <- POST('https://api.localytics.com/v1/query',  
      body = list(
        app_id = "APP_ID",
        metrics = "users",
        dimensions = "day",
        conditions = list(
          day = c("between", "2014-07-01", "2004-07-10")
        )
      ), 
      encode = "json",
      authenticate("API_key", "API_secret")
    )
    stop_for_status(r)
    content(r)
    

    (我将请求转换为 POST 并对所有内容使用 json 编码,如 API 文档中所述)。

    如果您想查看发送到服务器的确切内容,请使用 verbose() 配置。

    【讨论】:

      【解决方案2】:

      看起来 getURL 将您请求的参数作为 HTTP 标头传递,而不是像 curl 调用那样作为查询字符串数据传递。您应该改用getForm。另外,我不确定您的 toJSON 函数来自哪个库,但至少对于来自 rsjon 的函数来说,这不是正确的语法。

      无论如何,这是来自 R 的调用,它应该产生与您的 curl 命令相同的 HTTP 调用

      library(rjson)
      library(RCurl)
      object <- getForm('https://api.localytics.com/v1/query',  
          app_id = "APP_ID",
          metrics = "users",
          dimensions = "day",
          conditions = toJSON(list(day=c("between","2014-07-01","2004-07-10"))),  
          .opts=curlOptions(
              userpwd = "API_Key:API_Secret",  httpauth = 1L)
      )
      

      我发现使用站点http://requestb.in/ 对调试这些问题非常有帮助(而这正是我用来创建此解决方案的方法)。您可以向他们的站点发送请求,他们会记录发送的确切 HTTP 消息,以便您比较不同的方法。

      httpauth 部分来自this SO question,似乎需要触发测试站点的身份验证;对于“真正的”网站,您可能不需要它。

      【讨论】:

      • 使用ssl.verifypeer = FALSE 是一个非常非常糟糕的主意。
      • 很高兴知道。我只是想调整 OP 的代码。我不知道为什么它原来在里面,也不想拿出来以防万一。
      • 你应该总是把它拿出来!