如何在进行callout时在静态方法中获取会话id



我正在做一些包括LWC和工具API的东西。我写了下面这个方法,它做了一个callout。但是当我从lwc调用这个方法时,我无法获得会话Id,但如果我从开发控制台调用相同的方法,那么它就会正常工作。

Apex Code:
@AuraEnabled 
public static string getList(String fieldName){  
    HttpRequest req = new HttpRequest();
    req.setHeader('Authorization', 'Bearer ' + UserInfo.getSessionId());
    System.debug('res------>'+UserInfo.getSessionID());
    req.setHeader('Content-Type', 'application/json');
    req.setEndpoint('callout:Tooling_Query/query/?q=Select+id,Namespaceprefix,developername,TableEnumOrId+FROM+customfield+Where+developername+LIKE'' +fieldName+ ''');
    req.setMethod('GET');
    Http h = new Http();
    HttpResponse res = h.send(req);
    System.debug('res------>'+res.getBody());       
    return res.getBody();
}

当我从lwc调用它时它返回这个

[{"message":"此会话不能与REST api一起使用","errorCode"; "INVALID_SESSION_ID"}]

所以,我如何从lwc获得会话id,我已经通过Tooling_Query的名称设置了一个连接的应用程序和命名凭据并为远程站点添加URL。

请帮我一下。

你不能。在闪电Web组件上下文中调用的Apex代码无法获得启用api的会话Id。这在闪电Web组件开发指南中有记录:

根据安全策略,由闪电组件创建的会话不允许API访问。这个限制甚至阻止了Apex代码对Salesforce进行API调用。为特定的API调用使用命名凭据允许您仔细地有选择地绕过此安全限制。

对启用api的会话的限制不是偶然的。仔细检查任何使用命名凭据的代码,以确保您没有创建漏洞。

唯一支持的方法是使用指定用户身份验证的命名凭据。


有一种利用Visualforce页面从这样的Apex上下文中获取会话Id的黑客。我不建议这样做,特别是如果您需要访问特权的tools API。使用正确的解决方案并构建命名凭据。

最新更新