我正在尝试使用“ 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)
答案 0 :(得分:1)
在将管道构建到salesforce(SF)时,我尝试使用salesforcer。由于某种原因,我无法使它正常工作(我很糟糕),所以我从头开始构建管道。
此响应描述了如何使用OAuth授权流程使用SF REST API将数据管道构建到Salesforce Lightning(SF)中。
首先要设置几件事:
您还需要:
有关客户密钥和机密,授予服务和登录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文档,它非常具体)。 ua
是user_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)
fromJSON
是jsonlight
包中的函数。准备对该DF进行实质性的后处理,以获取所需形状的数据。
科幻小说不喜欢您做事容易,所以这是您需要克服的两个障碍:
lapply
使用了从SF获取记录的功能。)nextRecordsURL
和done
。 done
是一个标志,告诉您是否还有更多记录,并且nextRecordsURL
包含将下一个GET发送到的位置。例如。您可以编写一个简单的for循环,直到done
等于TRUE为止。不要忘记在每个循环中合并您检索到的数据。您将必须在原先希望执行一个查询的地方运行多个查询。 las。
要克服的最后一个障碍是,SF的数据结构实际上取决于查询(并且在扩展方面取决于SF中的数据库模式)。对关系表的查询将导致您获得的DF中的嵌套列表列。实际上只有您知道如何构造查询和数据库架构,才可以确定最好的方法。
最后的笔记。我在公司防火墙内部的公司服务器上的R服务器上运行此脚本。尽管这是相对安全的,但我确保我没有将凭据硬编码到我的R代码中。
最好避免这种情况;有权访问服务器的人可以读取您的凭据。我的幼稚方法:我为所有凭证创建了具有加密内容的rds文件(使用软件包cyphr
)。在服务器上,我仅存储加密的文件。我创建了一个读取和解密rds文件的函数。我确保仅在POST函数调用内调用此函数。这样可以确保在POST函数调用期间(每个会话一次),凭据仅存在于RAM中而没有加密。业余级别的安全性东西,但总比没有好。