如何使用R连接到Salesforce

时间:2019-05-22 14:01:32

标签: r

我正在尝试使用“ RForcecom”软件包将Rstudio连接到salesforce数据库。当我输入用户名,密码,loginURL和apiVersion时,出现以下错误:

Error in curl::curl_fetch_memory(url, handle = handle) : 
  Could not resolve host: na90.salesforce.comservices

我找到了以下链接,该链接解释了如何解决此问题 https://akitsche.netlify.com/post/2015-07-23-r-rmarkdown/,包名为“ curl”。

随着我继续使用ie_get_proxy_for_url命令获取代理,而不是将实际代理返回给我,而是给了我NULL。

我正在使用Mac。

##Install necessary packages
install.packages("RForcecom")
library(RForcecom)

##Pick out HTTP Proxy
library('curl')
ie_get_proxy_for_url(target_url)


##Connect the exististing Salesforce account to R
connection.salesforce <- rforcecom.login(username, password loginURL, apiVersion)

1 个答案:

答案 0 :(得分:1)

在将管道构建到salesforce(SF)时,我尝试使用salesforcer。由于某种原因,我无法使它正常工作(我很糟糕),所以我从头开始构建管道。

此响应描述了如何使用OAuth授权流程使用SF REST API将数据管道构建到Salesforce Lightning(SF)中。

首先要设置几件事:

  • 您需要一个具有用户名和密码的有效SF帐户

您还需要:

  • SF令牌(SF通过电子邮件将其发送给您,以打开密码更改)
  • 客户密钥,客户秘密
  • 授权服务(类似:/ services / oauth2 / token?grant_type = password)
  • 登录URL(类似https://login.salesforce.com

有关客户密钥和机密,授予服务和登录URL:请咨询您的IT部门或SF应用程序所有者。

我使用软件包httr,将POST发送到登录URL,如下所示:

data <- POST(
  loginurl %&% grantservice, # %&%: inline user defined function to concatenate two strings
  body = list(
    client_id = customerkey,
    client_secret = customersecret,
    username = username,
    password = password %&% token
))

如果一切顺利,SF将通过向您返回数据进行响应,您可以从SF获取访问令牌和实例URL。您以后的GET将需要此。

# obtain content data
content <- content(data)
access_token <- content$access_token
instance_url <- content$instance_url
id <- content$id
token_type <- content$token_type

这时,我已获得SF服务器的授权(我相信可以持续15分钟),我准备通过GET运行查询。 首先,我必须定义包含访问令牌的请求标头。实例URL成为查询的前缀。请注意,该查询必须是根据SF要求的格式的SOQL查询(请咨询SF文档,它非常具体)。 uauser_agent(也是httr函数)。

  request_headers <- c("Accept" = "application/json", 
                       "Content-Type" = "application/json",
                       "Authorization" = paste0("Bearer ", access_token))
  resultset <- GET(instance_url %&% query,  
                   add_headers(request_headers), ua)

  response_parsed <- content(resultset, "text", encoding="UTF-8")

SF返回可以使用content函数从httr中提取的数据。这将给我一个JSON对象,我可以将其转换为DF(如果您的查询是关系型的,通常是带有列表列的DF)。

resultset <- fromJSON(response_parsed, flatten = TRUE)

fromJSONjsonlight包中的函数。准备对该DF进行实质性的后处理,以获取所需形状的数据。

科幻小说不喜欢您做事容易,所以这是您需要克服的两个障碍:

  1. 使用GET发送到SF的字符串的长度限制为大约16500个字符。这听起来很多,但您会惊讶地超过该限制有多么容易。例如,我的查询包含一个带有数千个18个字符的SF标识符的IN子句。您将需要测试查询的长度,并将其分解为子查询。 (我创建了一个适当长度的子查询列表,然后lapply使用了从SF获取记录的功能。)
  2. 对于每个GET,
  3. SF最多返回2000条记录。如果希望返回更多记录,则需要查看从SF返回的2个数据元素,它们将使您获得下一组2000条记录:nextRecordsURLdonedone是一个标志,告诉您是否还有更多记录,并且nextRecordsURL包含将下一个GET发送到的位置。例如。您可以编写一个简单的for循环,直到done等于TRUE为止。不要忘记在每个循环中合并您检索到的数据。

您将必须在原先希望执行一个查询的地方运行多个查询。 las。

要克服的最后一个障碍是,SF的数据结构实际上取决于查询(并且在扩展方面取决于SF中的数据库模式)。对关系表的查询将导致您获得的DF中的嵌套列表列。实际上只有您知道如何构造查询和数据库架构,才可以确定最好的方法。

最后的笔记。我在公司防火墙内部的公司服务器上的R服务器上运行此脚本。尽管这是相对安全的,但我确保我没有将凭据硬编码到我的R代码中。 最好避免这种情况;有权访问服务器的人可以读取您的凭据。我的幼稚方法:我为所有凭证创建了具有加密内容的rds文件(使用软件包cyphr)。在服务器上,我仅存储加密的文件。我创建了一个读取和解密rds文件的函数。我确保仅在POST函数调用内调用此函数。这样可以确保在POST函数调用期间(每个会话一次),凭据仅存在于RAM中而没有加密。业余级别的安全性东西,但总比没有好。