获取记录的Salesforce API抛出错误无效会话

获取记录的Salesforce API抛出错误无效会话,api,get,salesforce,apex,Api,Get,Salesforce,Apex,我使用的是使用API获取记录的标准方法。 它在工作台上工作。 但是,如果我浏览URL,就会出现错误: <Errors> <Error> <errorCode>INVALID_SESSION_ID</errorCode> <message>Session expired or invalid</message> </Error> </Errors> 另一个网址: https://myinstance.

我使用的是使用API获取记录的标准方法。 它在工作台上工作。 但是,如果我浏览URL,就会出现错误:

<Errors>
<Error>
<errorCode>INVALID_SESSION_ID</errorCode>
<message>Session expired or invalid</message>
</Error>
</Errors>
另一个网址:

https://myinstance.salesforce.com/services/apexrest/Account/ID
我还编写了一个apex类,用于根据ID获取用户名:

@RestResource(urlMapping='/User/*')
global with sharing class UserManagerAPI 
{
    @HttpGet
    global static User doGet() 
    {
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        String userId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
        User result = [SELECT Name FROM User WHERE Id = :userId];
        return result;
    }

}

如何通过Apex类将此API的URL共享给希望使用该API的任何人

看起来您正在遵循trailhead模块,并且您的UserManagerAPI是正确的。在为自定义REST服务构建URL时,您需要添加一个URL,然后附加
/services/apexrest/
。对于您的
UserManagerAPI
服务,资源是
/User
,因此完整的服务URL是
https://.salesforce.com/services/apexrest/User

默认情况下,自定义REST服务遵循与许多现成的Salesforce API相同的安全语义。也就是说,调用方必须提供访问令牌才能调用API。必须通过oAuth授权获得访问令牌。发件人:

在进行RESTAPI调用之前,必须对应用程序进行身份验证 使用OAuth2.0的用户。为此,您需要:

  • 在Salesforce组织中将应用程序设置为已连接的应用程序
  • 确定连接的应用程序要使用的正确Salesforce OAuth端点
  • 通过几个不同的OAuth 2.0身份验证流之一对连接的应用程序用户进行身份验证
  • 授权基于客户id/credentials/etc和Salesforce中的用户帐户的组合。用户帐户附加到许可证+配置文件;这两项共同赋予用户某些特权。如果您使用的是便宜的许可证或权限不足的配置文件,则可能会看到
    会话已过期或无效
    错误消息

    另一种更有利的可能性是,您已经完成了上述所有操作,并以有效的方式获得了访问令牌,但令牌确实过期了。在这种情况下,您只需要通过重复oAuth授权流来获得一个新的令牌

    关于您尝试调用Account对象上的标准REST服务,
    /services/data/v45.0/sobjects/Account
    是有效的资源<代码>/services/data/v45.0/sobjects/Account/ID
    不是有效的资源,但是
    /services/data/v45.0/sobjects/Account/{ID}
    中的
    {ID}
    是帐户记录ID将起作用

    @RestResource(urlMapping='/User/*')
    global with sharing class UserManagerAPI 
    {
        @HttpGet
        global static User doGet() 
        {
            RestRequest req = RestContext.request;
            RestResponse res = RestContext.response;
            String userId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
            User result = [SELECT Name FROM User WHERE Id = :userId];
            return result;
        }
    
    }