Java 如何首先在Apex Restful服务中获取access_令牌,以便从外部调用get/POST方法?

Java 如何首先在Apex Restful服务中获取access_令牌,以便从外部调用get/POST方法?,java,salesforce,apex,salesforce-service-cloud,Java,Salesforce,Apex,Salesforce Service Cloud,我正在从以下链接执行Salesforce trailhead: 在本教程中,他们使用access\u token调用GET请求但他们没有指导我们如何获取访问令牌,这是从外部调用APEX Rest的重要步骤 我不得不做下面的事情,它告诉我错误: https://ap5.salesforce.com/services/oauth2/token?client_id="3MVG9d8..z.hDcPJZPIzGJ5UZDuKCOqbH8CCGCPnmwQuRbwLZ_2f.thbqWMX82H7JRG

我正在从以下链接执行Salesforce trailhead:

在本教程中,他们使用
access\u token
调用
GET
请求但他们没有指导我们如何获取
访问令牌
,这是从外部调用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

您可能需要调用api来获取访问令牌

这是我在C#中获取访问令牌的代码

异步公共静态任务GetAccessTokenByUserNamePasswordAuthenticationFlowAsync(字符串用户名、字符串密码、字符串令牌、字符串consumerKey、字符串ConsumerCret) {

        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;

    }
HttpClient authClient=newhttpclient();
字符串sfdcConsumerKey=consumerKey;
字符串SFDCConsumerCret=ConsumerCret;
字符串sfdcUserName=用户名;
字符串sfdcPassword=密码;
字符串sfdcToken=令牌;
字符串loginPassword=sfdcPassword+sfdcToken;
HttpContent=新的FormUrlEncodedContent(新字典
{
{“授权类型”,“密码”},
{“客户id”,sfdcConsumerKey},
{“客户机密”,SFDCConsumerCret},
{“用户名”,sfdcUserName},
{“密码”,登录密码}
}
);
ServicePointManager.SecurityProtocol=SecurityProtocolType.Tls11;//tuanv2t:Salesforce已更改为使用TLS 1.1->
//tuanv2t:如果没有,responseString将像这样{“error”:“unknown\u error”,“error\u description”:“重试您的请求”}
HttpResponseMessage=等待authClient.PostAsync(“https://login.salesforce.com/services/oauth2/token“,内容);
string responseString=wait message.Content.ReadAsStringAsync();
//JObject obj=JObject.Parse(responseString);
//var oauthToken=(字符串)obj[“访问令牌”];
//var serviceUrl=(字符串)obj[“实例url”];
var result=new GetAccessTokenResponse();
result.HttpResponseMessage=消息;
//将json字符串转换为对象

var accessTokenAPI=JsonConvert.DeserializeObject

我现在理解了这个概念,感谢分享其他链接

client\u id、client\u secret、username、password和grant\u 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());

非常感谢。这肯定会有帮助。如果我需要使用邮递员或rest客户端怎么办?