Как подключить Salesforce с помощью R? - PullRequest
1 голос
/ 11 июля 2020

Я получаю статус 500. Не могли бы вы мне помочь?

Я пытаюсь подключить Salesforce с помощью R, когда пытаюсь выполнить операцию входа. Я не добился успеха, не могли бы вы изучить этот код и исправить то, что мне не удалось.

library(RCurl)
library(httr)

  body1 = '<?xml version="1.0" encoding="utf-8"?>
  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
  <login xmlns="urn:partner.soap.sforce.com">
  <username>xxxxxx.Test@xxxxxx.com.xxxxxxx</username>
  <password>xxxxxxxxxxxx</password>
  </login>
  </s:Body>
  </s:Envelope>'

x <- httr::POST(url = "https://test.salesforce.com/services/Soap/48.0", body = body1, content_type("text/xml;charset=UTF-8"),SOAPAction = "login")
x$status_code

Ответы [ 3 ]

1 голос
/ 20 июля 2020

Спасибо за ответы на вопросы. После нескольких попыток я понял, что с заголовками возникла проблема. Я исправил заголовки, и теперь он отлично работает. Я могу без проблем выполнить запрос в Salesforce. Я разместил здесь свой полный код, чтобы каждый мог им воспользоваться. Я не эксперт в этом, но все же справился с этим кодом.

#######Required Packages
library(RCurl)
library(httr)
library(XML)
library(jsonlite)
library(xml2)
library(magrittr)
library(randomNames)
library(rlang)
library(generator)
library(stringr)
require(data.table)

body1 = '<?xml version="1.0" encoding="utf-8"?>\
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">\
  <s:Body>\
    <login xmlns="urn:partner.soap.sforce.com">\
      <username>XXXXXXXXXXXXXX</username>\
      <password>XXXXXXXXXXXXXXX</password>\
    </login>\
  </s:Body>\
</s:Envelope>\n'

require(httr)
################################Posting the Login##############################################
result <- POST("https://test.salesforce.com/services/Soap/u/48.0",body = body1,add_headers(.headers = c("Content-Type"="text/xml",'SOAPAction' = "https://test.salesforce.com")))

##############Parsing XML###############################################################
Output <- content(result)
doc = xmlTreeParse(Output, useInternal = TRUE)
top = xmlRoot(doc) 
xmlName(top)
names(top) 
names(top[[1]] [[1]] [[1]])
Session = top[[ 1 ]] [[1]] [[1]] [["sessionId"]] 
SessionId <- Session [1][1]$text
tok <- xmlToList(SessionId)  
Se <- paste("Bearer",tok,Sep="")
Se = trimws(Se)
Sever = top[[ 1 ]] [[1]] [[1]] [["serverUrl"]] 
SessionURL <- Sever [1][1]$text

################SF Query###########################################
SFQuery <- "SELECT Id,FirstName FROM Conatct limit 10"
SFQuery_Req <- GET(Pam,query = list(q=SFQuery),add_headers(Authorization=Se))
SFQuery_Con <- content(SFQuery_Req, as = 'text') %>% fromJSON()
SFQuery_Con_DF <- data.frame(SFQuery_Con$records)
0 голосов
/ 19 июля 2020

У меня есть пакет R под названием {salesforcer}, который позволяет пользователям взаимодействовать с 6 различными API-интерфейсами Salesforce (SOAP, REST, Bulk 1.0, Bulk 2.0, Metadata, Reports и Dashboards) для управления своими организациями. Если один из этих API соответствует вашим потребностям, я бы рекомендовал использовать пакет, чтобы вам не приходилось писать код с нуля. Ниже приведен пример подключения с использованием OAuth 2.0, иногда называемого системой единого входа, или с помощью имени пользователя, пароля и токена безопасности. Посетите сайт документации пакета для получения дополнительных сведений и виньеток по адресу: https://stevenmmortimer.github.io/salesforcer/

# install.packages('salesforcer')
library(salesforcer)

# Using OAuth 2.0 authentication
sf_auth()

# Using Basic Username-Password authentication
sf_auth(username = "test@gmail.com", 
        password = "{PASSWORD_HERE}",
        security_token = "{SECURITY_TOKEN_HERE}")

# pull down information of person logged in
# it's a simple API call to get started 
# and confirm connection to the APIs
user_info <- sf_user_info()

sprintf("Organization Id: %s", user_info$organizationId)
#> [1] "Organization Id: 00D6A0000003dN3UAI"

sprintf("User Id: %s", user_info$userId)
#> [1] "User Id: 0056A000000MPRjQAO"
0 голосов
/ 13 июля 2020

Это может быть много вещей, не все связанные с вашим кодом ...

  1. Ваши пространства имен SOAP могут быть неправильными. Может быть, сначала попробуйте использовать SoapUI / Postman / curl, и как только вы заставите их работать - проверьте код. Попробуйте использовать эту версию тегов

     <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:partner.soap.sforce.com">
        <soapenv:Body>
           <urn:login>
              <urn:username>usernamegoeshere</urn:username>
              <urn:password>passwordgoeshere</urn:password>
           </urn:login>
        </soapenv:Body>
     </soapenv:Envelope>
    
  2. Войдите в SF org вручную и проверьте историю входа этого пользователя внизу страницы. Вы вообще видите свою попытку? Если нет - вы уверены, что подключаетесь к нужному месту (производственная среда или песочница)? Или, может быть, у вас есть какой-то прокси-сервер, установленный вашей корпоративной ИТ-службой, и он просто проглатывает соединения ... Если есть запись в истории входа в систему - это говорит о недопустимом пароле? Слишком много неудачных попыток входа в систему? Требуется токен безопасности?

  3. Возможно, администратор отключил вход в систему с generi c test.salesforce.com, и вам придется использовать то, что вы видите в разделе «Настройка» -> «Мой домен».

  4. Возможно, администратор настроит вашего пользователя для единого входа (вы видите обычную страницу входа в SF или, например, перенаправляетесь на некоторые вещи Active Directory). В этом случае будет сложнее подключиться через API.

  5. Возможно, ваш пользователь не поддерживает API, это будет параметр «Профиль / набор разрешений». Вы используете учетную запись системного администратора? Существуют ли в профиле какие-либо политики входа в систему, например доступ только с определенных IP-адресов или в определенные часы входа в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...