Как сначала получить access_token в службе Apex Restful для вызова методов GET / POST извне?

Я делаю след в Salesforce по ссылке: https://trailhead.salesforce.com/modules/apex_integration_services/units/apex_integration_webservices.

В этом руководстве они использовали access_token для вызова GET запроса. Но они не объяснили нам, как получить access_token, что является важным шагом для вызова APEX Rest извне.

введите описание изображения здесь

Я привязался к тому, чтобы сделать что-то вроде того, что он говорит мне об ошибке:

https://ap5.salesforce.com/services/oauth2/token?client_id="3MVG9d8..z.hDcPJZPIzGJ5UZDuKCOqbH8CCGCPnmwQuRbwLZ_2f.thbqWMX82H7JRGx4
6VYyEkuwzQ9._ww5"&client_secret="1180508865211885204"&username="pXXXXXXXXXXXXXXX.com"&password="AgXXXXXXXX"&grant_type=password

введите описание изображения здесь


person Community    schedule 21.04.2017    source источник


Ответы (2)


Теперь я понял концепцию и спасибо за то, что поделился другими ссылками.

client_id, client_secret, username, password and grant_type следует отправлять в HTTP POST теле, а не в заголовке.

HttpRequest req = new HttpRequest();
req.setMethod('POST');
req.setHeader('Content-Type','application/x-www-form-urlencoded');
req.setEndpoint('https://ap5.salesforce.com/services/oauth2/token');

String CLIENT_ID = 'XXXXXXXXXXXXXXXXXXXXXXXXX';
String CLIENT_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXX';
String USERNAME = 'XXXXXXXXXXXXXX';
String PASSWORD = 'XXXXXXXXXXXXXX';

req.setBody('grant_type=password' + '&client_id='+CLIENT_ID + 
            '&client_secret='+CLIENT_SECRET + '&username='+USERNAME + '&password='+PASSWORD);

Http http = new Http();
HTTPResponse response = http.send(req);
System.debug('Body ' + response.getBody());
System.debug('Status ' + response.getStatus());
System.debug('Status code ' + response.getStatusCode());
person Community    schedule 09.05.2017

Возможно, вам потребуется вызвать api, чтобы получить токен доступа.

Вот мой код на C # для получения токена доступа

асинхронная общедоступная статическая задача GetAccessTokenByUserNamePasswordAuthenticationFlowAsync (строковое имя пользователя, строковый пароль, строковый токен, строковый consumerKey, строка consumerSecret) {

        HttpClient authClient = new HttpClient();


        string sfdcConsumerKey = consumerKey;
        string sfdcConsumerSecret = consumerSecret;

        string sfdcUserName = username;
        string sfdcPassword = password;
        string sfdcToken = token;



        string loginPassword = sfdcPassword + sfdcToken;

        HttpContent content = new FormUrlEncodedContent(new Dictionary<string, string>
            {
                {"grant_type","password"},
                {"client_id",sfdcConsumerKey},
                {"client_secret",sfdcConsumerSecret},
                {"username",sfdcUserName},
                {"password",loginPassword}
            }
             );
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11; //tuanv2t: Salesforce has changed to use TLS 1.1 -> 
        //tuanv2t: Without, responseString will like this {"error":"unknown_error","error_description":"retry your request"}
        HttpResponseMessage message = await authClient.PostAsync("https://login.salesforce.com/services/oauth2/token", content);

        string responseString = await message.Content.ReadAsStringAsync();

        //JObject obj = JObject.Parse(responseString);
        //var oauthToken = (string)obj["access_token"];
        //var serviceUrl = (string)obj["instance_url"];

        var result = new GetAccessTokenResponse();
        result.HttpResponseMessage = message;
        //Convert json string into object
        var accessTokenAPI = JsonConvert.DeserializeObject<AccessTokenAPI>(responseString);

        if (accessTokenAPI != null)
        {
            result.AccessToken = new AccessTokenModel();
            result.AccessToken.AccessToken = accessTokenAPI.access_token;
            result.AccessToken.Id = accessTokenAPI.id;
            result.AccessToken.InstanceUrl = accessTokenAPI.instance_url;
            result.AccessToken.IssuedAt = accessTokenAPI.issued_at;
            result.AccessToken.Signature = accessTokenAPI.signature;
            result.AccessToken.TokenType = accessTokenAPI.token_type;
        }
        return result;

    }

Здесь можно загрузить весь мой пример исходного кода (включая также SOAP API) https://bitbucket.org/tuanv2t/salesforceapidemo

person tuanv2t    schedule 22.04.2017
comment
Большое спасибо. Это обязательно поможет. Что делать, если мне нужно использовать Почтальон или клиент отдыха? - person ; 22.04.2017